정규식 : 첫 번째 문자 발생까지 일치


356

특정 문자가 처음 나타날 때까지 모든 것과 일치하는 패턴을 찾고 있습니다 . ";" - 세미콜론 .

나는 이것을 썼다 :

/^(.*);/

그러나 실제로 세미콜론이 마지막으로 나타날 때까지 모든 세미콜론을 포함합니다.


65
/^(.*?);/또한 작동해야 하지만 ( 욕심지지 않음) 주어진 대답을 사용 [^;]*하는 것이 좋습니다.
Pascal

세미콜론 자체가 아닌 세미콜론 이후의 모든 것을 어떻게 선택 하시겠습니까?
Muhammad Umer

이 작동 \w+(?!([^]+;)|;)하지만 볼 수없는 이유는 무엇입니까? .+(?!([^]+;)|;)
Muhammad Umer

1
파스칼, 당신은 대답으로 그것을 작성해야합니다!
Sean Kendle

@Pascal 답변으로 적합합니다! 감사!
neverMind9 9

답변:


503

당신은 필요

/[^;]*/

[^;]A는 문자 클래스 , 그것은 모든하지만 세미콜론 일치합니다.

perlre맨 페이지 를 인용하려면 :

문자 목록을 []로 묶어 문자 클래스를 지정할 수 있으며,이 문자는 목록의 모든 문자와 일치합니다. "["뒤의 첫 문자가 "^"이면 클래스는 목록에없는 문자와 일치합니다.

이것은 대부분의 정규식 방언에서 작동합니다.


이 솔루션의 좋은 부분은 내가 가진 내 경우에는 선, 예를 들면 끝과 일치한다는 것입니다 foo=bar;baz=bax;bab=baf과 일치 bab=baf심지어 더 없다 ;정확히 내가 필요. 확실하지 왜 작동하지만 사양은 경기의 모든하지만 대상 기호 ... 말한다면
skryvets

303

할 것이다;

/^(.*?);/

작업?

?게으른 연산자 일치 전에 가능한 한 적게되도록 정규식 잡고있다 ;.


4
나중에 Tim Toady로 중탄산염을 늘린 후 게으른 수량 자에 백 트랙킹이 포함되어있어 부정 된 캐릭터 클래스가 승리한다고 생각합니다. 어쨌든 +1.
Amarghosh

3
성능 주제에 대한 가치가있는 블로그
Glenn Slaven

38

/^[^;]*/

[^;]는 세미콜론을 제외한 모든 항목과 일치합니다. 대괄호는 집합 일치 연산자이며, 본질적 으로이 문자 집합의 모든 문자와 일치 ^하므로 처음에는 역 일치 하므로이 세트에 없는 것은 일치 시킵니다.


3
이 답변의 첫 번째 ^는 정규 표현식에 완전히 다른 의미를 부여합니다. 정규 표현식은 문자열의 시작 부분부터 시작하는 일치 항목 만 찾습니다. 이 경우 정규식을 한 번만 실행 하면 사실상 아무런 문제가 없습니다 . 단일 문자열 내에서 여러 개의 일치 항목을 찾으려면 첫 번째 ^를 입력해야합니다.
Dan Breslau

4
그는 세미콜론이 처음 나타날 때까지 모든 것을 일치시키고 싶다고 말했기 때문에 문자열의 시작부터 시작했다고 가정했습니다.
Glenn Slaven



8

샘플 텍스트:

"this is a test sentence; to prove this regex; that is g;iven below"

예를 들어 위의 샘플 텍스트가 있으면 정규 표현식 /(.*?\;)/은 세미콜론을 ;포함하여 세미콜론 ( ) 이 처음 나타날 때까지 모든 것을 제공합니다 ."this is a test sentence;"


3
;정규식 특수 문자가 아니기 때문에 char 을 벗어날 필요 는 없습니다. 그룹화 ()도 필요하지 않습니다. 당신은 함께 갈 수 있습니다/.*?;/
Aliaksei Kliuchnikau

1
네, 당신 말이 맞아요 탈출은 "미안보다 더 안전합니다"
poncius

2
이것이 내가 찾던 대답입니다. 그래서 ? 첫 경기에서 경기를 끝내나요? 정규식의이 속성의 이름은 무엇입니까?
Parziphal

1
@Parziphal ?문자는 경기를 게으르게 만듭니다 (가능한 한 몇 번 일치시킵니다). 첫 번째 세미콜론까지 정규식 일치 문자를 생각하면 포기하기 때문에 더 이상 가지 않습니다 (lazy;))
derekantrican

5

이것은 정규식 솔루션이 아니라 문제 설명에 충분히 간단한 것입니다. 문자열을 나누고 배열에서 첫 번째 항목을 가져옵니다.

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

산출

$ php test.php
match everything until first

5

이것은 속성을 포함하여 xml 태그의 모든 문자를 일치시키는 방법을 알아 내려고 노력하면서 매우 도움이되었습니다. 나는 "모든 것을 끝까지 일치시킨다"라는 문제에 부딪쳤다.

/<simpleChoice.*>/

그러나 다음과 같은 문제를 해결할 수있었습니다.

/<simpleChoice[^>]*>/

이 게시물을 읽은 후. 모두 감사합니다.


1
html / xml은 기계 형식이기 때문에 html / xml을 실제로 구문 분석하는 것이 더 효율적이라는 것을 알았습니다. 정규식은 자연어입니다.
레온 페도 토프

1
좋은. 이것을 사용하여 <!DOCTYPE>태그의 구문 오류가있는 XML 문서를 수정했습니다 . 파서가 처리 할 수 ​​없었기 때문에.
마틴 슈나이더

5

이것은 각 문자열에서만 첫 번째 항목까지 일치하며 후속 항목은 무시합니다.

/^([^;]*);*/

3

"/^([^\/]*)\/$/" 나를 위해 일한 것처럼 다음과 같은 배열에서 최상위 "폴더"만 가져옵니다.

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this

2

아무도 당신에게 정답을주지 않았다는 것이 정말로 슬 sad습니다 ....

정규식에서? 탐욕스럽지 않습니다. 기본적으로 정규 표현식은 가능한 한 많이 일치합니다 (욕심쟁이)

단순히? 그리고 그것은 욕심이없고 가능한 적은 일치 할 것입니다!

행운을 빌어 요, 희망이 있습니다.


3
이것은 실제 정규식 구현 에 크게 의존하며 모든 구현에 욕심없는 모드가있는 것은 아닙니다.
karatedog

0

나는 그것을 발견했다

/^[^,]*,/

잘 작동합니다.

','는 여기서 "구분자"입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.