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

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

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

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

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

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



답변

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

/.+?(?=abc)/

작동 원리

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

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

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

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

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

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

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


답변

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

/^(.*?)abc/

설명:

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

^ 경기 시작

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

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

whatever whatever something abc something abc

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


답변

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

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

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

Regex101 스크린 샷


답변

필요한 것은 assertion과 같은 것 .+? (?=abc)입니다.

참조 : Lookahead 및 Look-hind Zero-Length Assertions

그주의 [abc]와 동일하지 않습니다 abc. 괄호 안에는 문자열이 아닙니다-각 문자는 가능성 중 하나입니다. 괄호 밖에서는 문자열이됩니다.


답변

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

.+?(abc)

예를 들어,이 줄에서 :

I have this very nice senabctence

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

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

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


답변

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

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

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

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

편집하다

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

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


답변

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

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

(“(.*?)”)/지

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

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

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