정규식 두 문자열 사이의 모든 문자와 일치


434

예 : "이것은 단순한 문장입니다."

"This is"와 "sentence"사이의 모든 문자를 일치시키고 싶습니다. 줄 바꿈은 무시해야합니다. 올바른 구문을 알 수 없습니다.


11
Regex를 사용하는 환경을 표시 할 수 있습니다. 줄 바꿈을 "무시"하여 의미하는 바에 따라 차이가있을 수 있습니다.
Andrew Barber

답변:


646

예를 들어

(?<=This is)(.*)(?=sentence)

정규식

나는 lookbehind를 사용 하고 "This is"와 "sentence"가 매치에 포함되지 않도록 (?<=)앞을 내다 (?=)보지만, 이것은 유스 케이스에 달려 있습니다 This is(.*)sentence. 간단히 쓸 수도 있습니다 .

여기서 중요한 것은 정규식 엔진의 "dotall"모드를 활성화 .하여 줄 바꿈과 일치하는 것입니다. 그러나이 작업을 수행하는 방법은 정규식 엔진에 따라 다릅니다.

다음은 또는를 사용하는 .*경우 .*?입니다. 첫 번째는 탐욕스럽고 문자열의 마지막 "문장"까지 일치하고 두 번째 것은 게으 르며 문자열의 다음 "문장"까지 일치합니다.

최신 정보

정규식

This is(?s)(.*)sentence

(? s)가 dotall 수정자를 켜면 .개행 문자 와 일치합니다.

업데이트 2 :

(?<=is \()(.*?)(?=\s*\))

"이것은 (단순한) 문장"과 일치합니다. Regexr 에서 여기를 참조하십시오


@tchrist, 이것을 찾아 봐서 미안합니다. 이것이 올바른지 이해하고 This is(?s)(.*)sentence작동합니까?
stema

@stema : 예, 대부분의 정규식 라이브러리에서 "모두 도트"모드를 활성화해야합니다.
tchrist

1
대부분 내 문제를 해결했지만 패턴에 공백 문자를 어떻게 포함합니까? 시퀀스 끝에 "")와 일치하도록 "(. *?) ())"을 시도했지만 작동하지 않았습니다.
0xbadf00d

28
regexr는 이제 lookbehind가 자바 스크립트에서 지원되지 않는다고 말합니다
Kovo

2
이 분할의 반복 인스턴스를 텍스트 블록으로 처리하는 방법이 있습니까? 예 : "이것은 단순한 문장입니다. 여기에 몇 가지 추가 내용이 있습니다. 여기에는 간단한 문장이 있습니다. 그리고 여기에는 더 많은 물건이 있습니다. 이것은 단순한 문장입니다.". 현재 각 인스턴스가 아닌 전체 문자열과 일치합니다.
jzadra

181

게으른 수량 자 필요

허용 된 답변의 정규 표현식이 나에게 맞지 않기 때문에이 질문을 부활시킵니다. 왜? 때문에

(?<=This is)(.*)(?=sentence)

일치 my first sentence. This is my secondThis is my first sentence. This is my second sentence.

데모를 참조하십시오 .

두 둘러보기 사이에 지연 수량 화기가 필요합니다. ?별표를 추가 하면 별이 게으르게됩니다.

이것은 당신이 원하는 것과 일치합니다 :

(?<=This is).*?(?=sentence)

데모를 참조하십시오 . 필요하지 않은 캡처 그룹을 제거했습니다.

줄 바꿈에 걸쳐 일치하는 DOTALL 모드

데모에서는 "dot matches line breaks mode"(일명) dot-all이 설정됩니다 ( 다양한 언어로 DOTALL을 켜는 방법 참조 ). 많은 정규 표현식에서 온라인 수정 자로 설정 (?s)하여 표현식을 다음 과 같이 설정할 수 있습니다 .

(?s)(?<=This is).*?(?=sentence)

참고


캡처 그룹에 대한 내용이 정확합니다. 내가 왜 이런 짓을했는지 모르겠다. 그러나 사이의 차이 .*와는 .*?도 내 대답 ( "업데이트"이전 단락)에 설명되어 있습니다. 그래서 나는 내 대답이 틀렸다고 생각하지 않습니다.
stema

2
@stema nitpicking에 대해 죄송합니다. 어제 귀하의 답변 중 일부를 순항하는 동안 그것은 나를 속이게 한 유일한 것입니다. :) 나는 첫 줄을 부드럽게 is incorrect했다 doesn't seem quite correct to me... 희망은 당신을 혼란 스럽게하지 않을 것입니다. 아마도 그러한 트래픽이 많은 대답의 정규식이 무엇인지에 대한 인식의 차이 일뿐입니다.
zx81

39

시도 This is[\s\S]*sentence, 자바 스크립트에서 작동


이 방법으로 게으른 조회를 수행하는 방법?
AGamePlayer

4
@AwQiruiGuo 위와 동일합니다. [\s\S]*?(또한 욕심없는 와일드 카드라고도 함)
phil294 April


13

이것을 사용하십시오 : (?<=beginningstringname)(.*\n?)(?=endstringname)


모든 투표가 왜되는지 모르는 경우 0-1 개의 줄 바꿈이 가능하며 줄 바꿈은 바로 직전이어야합니다.endstringname
OGHaza

로그 라인의 시작 부분 (타임 스탬프 등)을 제거하는 것이 유용하다는 것을 알았습니다. 시작 문자열에 새 줄을 사용하고 끝 문자열에 "at"를 사용했습니다.
Stan

2

누군가 Jenkins 컨텍스트 내에서 이에 대한 예를 찾고있는 경우. build.log를 구문 분석하고 일치하는 것을 찾으면 일치하는 빌드에 실패합니다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

node{    
    stage("parse"){
        def file = readFile 'build.log'

        def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
        Matcher match = regex.matcher(file)
        match.find() {
            capturedText = match.group(1)
            error(capturedText)
        }
    }
}

1

당신은 이것을 간단히 사용할 수 있습니다 : \This is .*? \sentence


0

숭고한 텍스트 3x

숭고한 텍스트로, 당신은 단순히 예를 들어 당신의 경우에 유지하고자하는 두 단어를 씁니다.

"이것은"과 "문장"

그리고 당신은 사이에. *를 씁니다.

This is .* sentence

그리고 이것은 당신을 잘해야합니다


Sublime Text 에서이 작업을 수행하는 방법에 대한 질문은 확실하지 않지만 대부분 Sublime Text에서 작동합니다. "This is"와 "sentence"사이에 줄 바꿈이있을 때는 작동하지 않습니다. 또한 숭고한 텍스트는 두 문자열 사이 의 텍스트 만이 아니라 "This is"및 "Sentence"를 선택합니다 .
Dylan Kinnett

0

내가 한 방법은 다음과 같습니다.
이것은 필요한 특정 정규 표현식을 알아내는 것보다 쉬웠습니다.

int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 

0

VIM에서 빠른 검색을하려면 Vim Control 프롬프트에서 사용할 수 있습니다 : / This is. * \ _. * sentence


0

Python3의 print ( "string")을 사용하여 오래된 스크립트에서 Python2의 인쇄 "문자열"사이 에서이 인쇄 구문을 변환하기 위해 정규 표현식을 검색했습니다. 잘 작동합니다. 그렇지 않으면 추가 변환에 2to3.py를 사용하십시오. 다른 사람들을위한 나의 해결책은 다음과 같습니다.

Regexr.com에서 사용해보십시오 (어떤 이유로 NP ++에서는 작동하지 않음).

find:     (?<=print)( ')(.*)(')
replace: ('$2')

변수의 경우 :

(?<=print)( )(.*)(\n)
('$2')\n

라벨 및 변수의 경우 :

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

Python2의 모든 인쇄 "문자열"을 Python3의 print ( "string")로 바꾸는 방법은 무엇입니까?


0

이것은 나를 위해 일했습니다 ( VS 코드를 사용하고 있습니다 ).

에 대한: This is just\na simple sentence

사용하다: This .+ sentence


0

Java 접근 방식을 사용하여 두 문자열 사이의 모든 것을 일치시키는 RegEx.

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

RegEx (. ?) * 를 사용하기 위해 Pattern 및 Matcher 객체를 사용합시다 .

Pattern p = Pattern.compile("Code "(.*?)" world");   //java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //java.util.regex.Matcher;

Matcher는 둘 이상의 일치 항목을 포함 할 수 있으므로 결과를 반복하여 저장해야합니다.

while(m.find()){   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.
}

이 예제에는 "저장할 것" 이라는 단어 만 포함 되지만 더 큰 텍스트에서는 더 많은 일치 항목을 찾을 수 있습니다.

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