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


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 second에This 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.