정규식에서“이 일련의 문자까지 무엇이든 일치”시키는 방법은 무엇입니까?


514

이 정규식을 사용하십시오 /^[^abc]/. a, b 또는 c를 제외한 문자열 시작 부분의 단일 문자와 일치합니다.

*이후에 – 를 추가하면 /^[^abc]*/– 정규 표현식은 a, 또는 b , 또는을 충족 할 때까지 각 후속 문자를 결과에 계속 추가합니다 c.

예를 들어, 소스 문자열 "qwerty qwerty whatever abc hello"을 사용하면 표현식이 최대와 일치합니다 "qwerty qwerty wh".

그러나 일치하는 문자열을 원한다면 어떻게해야합니까? "qwerty qwerty whatever "

다시 말해, 정확한 순서 까지 모든 것을 어떻게 일치시킬 수 "abc"있습니까?


무슨 소리 야 match but not including?
Toto

5
"qwerty qwerty whatever ""abc"를 포함하지 않고 일치 시키려고합니다. 즉, 결과 일치를 원하지 않습니다"qwerty qwerty whatever abc" .
callum

2
자바 스크립트에서 당신은 할 수 있습니다 do string.split('abc')[0]. 분명히이 문제에 대한 공식적인 대답은 아니지만 정규식보다 더 간단하다는 것을 알았습니다.
Wylliam Judd

답변:


1020

사용중인 정규식의 맛을 지정하지 않았지만 "완전한"것으로 간주 될 수있는 가장 인기있는 형식으로 작동합니다.

/.+?(?=abc)/

작동 원리

.+? 부분은 욕심없는 버전 .+ (하나 이상)입니다. 를 사용할 때 .+엔진은 기본적으로 모든 것과 일치합니다. 그런 다음 정규 표현식에 다른 것이 있으면 다음 부분과 일치시키는 단계로 돌아갑니다. 이것은이다 욕심 의미, 행동 만족시키기 위해 가능한 한 많이 .

를 사용할 때 .+?한 번에 모두 일치하고 다른 조건 (있는 경우)으로 돌아가는 대신 엔진은 정규식의 후속 부분이 일치 할 때까지 (다음에있는 경우) 다음 문자를 단계적으로 일치시킵니다. 이것은이다 않은 욕심 , 즉 경기를 가장 적은 수를 충족하기 위해 .

/.+X/  ~ "abcXabcXabcX"        /.+/  ~ "abcXabcXabcX"
          ^^^^^^^^^^^^                  ^^^^^^^^^^^^

/.+?X/ ~ "abcXabcXabcX"        /.+?/ ~ "abcXabcXabcX"
          ^^^^                          ^

우리가 가지고있는 것을 따라 하는 제로 폭 주장 하는 주변의 모습 . 이 그룹화 된 구성은 내용과 일치하지만 일치하는 문자 ( 너비 0 ) 로 계산되지 않습니다 . 일치하는지 아닌지 ( assertion ) 만 반환합니다 .(?={contents})

따라서 다른 용어로 정규식 /.+?(?=abc)/은 다음을 의미합니다.

"abc"를 세지 않고 "abc"가 발견 될 때까지 가능한 한 적은 문자를 일치 시키십시오.


12
줄 바꿈을 사용하면 줄 바꿈으로 작동하지 않을 수 있습니다.
einord

3
차이 무엇 .+?.*?
로비

4
@ robbie0630 +은 1 이상을 의미하며, 여기서 *0 이상을 의미합니다. ?의지를 포함 / 제외 하면 탐욕 스럽거나 탐욕스럽지 않게됩니다.
jinglesthula

2
@ testerjoe2 /.+?(?=abc|xyz)/
JohnWrensby

4
찾고자하는 패턴이 존재하지 않으면 이것이 아무것도 선택하지 못하는 것을 알았습니다. 대신에 ^(?:(?!abc)(?!def).)*당신이 원하지 않는 패턴을 제외시키기 위해 체인을 사용할 수 있다면 패턴이 존재하지 않더라도 필요에 따라 모든 것을 잡을 것입니다
Karan Shishoo

122

"abc"까지 모든 것을 캡처하려는 경우 :

/^(.*?)abc/

설명:

( )사용하여 액세스 괄호 안의 식을 캡처 $1, $2

^ 경기 시작

.*?무의미한 것과 일치 (필요한 최소 문자 수와 일치)-[1]

[1] 이것이 필요한 이유는 다음 문자열에서 그렇지 않기 때문입니다.

whatever whatever something abc something abc

기본적으로 정규 표현식은 욕심이 많으 므로 가능한 한 많이 일치합니다. 따라서 /^.*abc/"무엇이든지 무엇인가 abc"와 일치합니다. 욕심없는 수량자를 추가하면 ?정규식은 "무엇이든"일치합니다.


4
고맙지 만 귀하 의 경기에 abc 포함되어 있습니다. 즉, 결과 일치는 "어떤 것이 든 abc"입니다.
callum

1
궁극적으로하려는 일을 설명해 주시겠습니까? 시나리오가 다음과 같은 경우 : (A) "abc"로 이어지는 모든 것을 얻으려면 캡처하려는 항목 주위에 괄호를 사용하십시오. (B) 문자열을 "abc"와 일치 시키려고합니다. 어쨌든 abc를 확인해야하므로 관계없이 정규식의 일부 여야합니다. 그 밖에 있는지 어떻게 확인할 수 있습니까?
Jared Ng

sed욕심없는 일치를 지원하지 않거나 룩 어라운드 ( (?=...))를 지원하지 않습니다 . 다른 무엇을 할 수 있습니까? 예제 명령 : echo "ONE: two,three, FOUR FIVE, six,seven" | sed -n -r "s/^ONE: (.+?), .*/\1/p"returns two,three, FOUR FIVE, 그러나 나는 기대합니다 two,three...
CodeManX

1
@CoDEmanX 특히 sed에 관한 것이기 때문에 주석이 아닌 별도의 질문으로 게시해야 할 것입니다. 당신의 질문에 답하기 위해, 당신은 이 질문에 대한 답을보고 싶을 것 입니다. 또한 귀하의 예에서 욕심이 아닌 인식 통역사는 two, not을 반환 two,three합니다.
Jared Ng

3
이것은 어떻게 매주 정규 표현식 답변을 해야 볼 - 예 및 모든 부분의 설명 ...
jave.web

54

@Jared Ng와 @Issun이 지적했듯이 "특정 단어 나 하위 문자열에 모두 일치"또는 "특정 단어 나 하위 문자열에 일치하는 모든 것"과 같은 이러한 종류의 RegEx를 해결하는 열쇠는 "전후"길이가 0 인 어설 션이라고합니다. . 자세한 내용은 여기를 참조하십시오.

당신의 특별한 경우에, 그것은 긍정적 인 전망으로 해결할 수 있습니다 : .+?(?=abc)

그림은 천 단어의 가치가 있습니다. 스크린 샷에서 자세한 설명을 참조하십시오.

Regex101 스크린 샷


23
.+?(?=abc)복사 할 수있는 정규식이 더 가치가 있습니다.
Tom

선행 공백을 제외하는 것은 어떻습니까?
Royi


7

Java의 정규 표현식의 경우 대부분의 정규식 엔진에서도 믿습니다. 마지막 부분을 포함하려면 다음과 같이하십시오.

.+?(abc)

예를 들어,이 줄에서 :

I have this very nice senabctence

"abc"까지 모든 문자를 선택하고 abc도 포함

정규식을 사용하면 결과는 다음과 같습니다. I have this very nice senabc

이것을 테스트하십시오 : https://regex101.com/r/mX51ru/1


4

내 문제를 해결하는 데 도움을 찾은 후에이 stackoverflow 질문으로 끝났지 만 해결책을 찾지 못했습니다.

그래서 나는 곧 정규식에 도달했을 때 즉흥적으로해야했습니다.

여기에 이미지 설명을 입력하십시오

보시다시피, 마지막 대시를 포함하지 않고 "grp-bps"폴더 앞에 하나의 폴더가 필요했습니다. 그리고 "grp-bps"폴더 다음에 하나 이상의 폴더가 있어야했습니다.

편집하다

복사하여 붙여 넣기를위한 텍스트 버전 (텍스트의 'grp-bps'변경) :

.*\/grp-bps\/[^\/]+

6
텍스트 버전이 없습니까? 🙄
kiradotee

2

이것은 정규식에 의미가 있습니다.

  1. 정확한 단어는 다음 regex 명령에서 얻을 수 있습니다.

("(.*?)")/지

여기서 큰 따옴표 안에 속하는 정확한 단어를 전역 적으로 얻을 수 있습니다. 예를 들어 검색 텍스트가

이것은 "큰 따옴표"단어에 대한 예입니다

그러면 우리는 그 문장에서 "큰 따옴표"를 얻을 것입니다.


StackOverflow에 오신 것을 환영합니다. 도와 주셔서 감사합니다. 그러나 이것이 이것이 질문에 명시된 목표에 어떻게 도움이되는지 알기가 어렵습니다. 정교하게 할 수 있습니까? 주어진 예에 적용 할 수 있습니까? 의 취급에 집중하는 "것 같습니다.이 질문과 관련이없는 것 같습니다.
Yunnosch

1
안녕하세요, 나는 특수 문자 사이에 단어 나 문장을 얻는 방법을 설명했습니다. 여기서 우리의 질문은 또한 "특수 문자 시퀀스까지의 모든 것"입니다. 그래서 큰 따옴표로 시도하고 여기에 설명했습니다. 감사.
Ponmurugan Mohanraj

2

파이썬에서 :

.+?(?=abc) 한 줄 경우에 작동합니다.

[^]+?(?=abc)파이썬은 [^]를 유효한 정규식으로 인식하지 않기 때문에 작동하지 않습니다. 여러 줄을 일치 시키려면 re.DOTALL 옵션을 사용해야합니다. 예를 들면 다음과 같습니다.

re.findall('.+?(?=abc)', data, re.DOTALL)

0

하위 표현식이 필요하다고 생각합니다. 내가 올바르게 기억한다면 ()하위 표현식에 일반 괄호를 사용할 수 있습니다 .

이 부분은 grep 매뉴얼에서 가져온 것입니다.

 Back References and Subexpressions
       The back-reference \n, where n is a single digit, matches the substring
       previously matched  by  the  nth  parenthesized  subexpression  of  the
       regular expression.

^[^(abc)]트릭을해야하는 것과 같은 일을하십시오.


죄송합니다. 작동하지 않습니다. abc를 괄호 안에 넣는 것은 아무런 차이가없는 것 같습니다. 이들은 여전히 ​​"a OR b OR c"로 취급됩니다.
callum

-1

$마크 문자열의 끝이 같은 일을해야하므로이 : [[^abc]*]$당신의 반복 끝나지 않는 것을 찾고있는 곳 abc,하지만 마지막에 될 것

또한 정규 표현식 (예 : php 또는 js)으로 스크립팅 언어를 사용하는 경우 처음 패턴을 발견 할 때 중지되는 검색 기능이 있습니다 (왼쪽에서 시작 또는 오른쪽에서 시작 또는 php, 문자열을 미러링하기 위해 implode를 수행 할 수 있습니다).


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