예를 들어이 정규식
(.*)<FooBar>
일치합니다 :
abcde<FooBar>
그러나 여러 줄에서 어떻게 일치합니까?
abcde
fghij<FooBar>
예를 들어이 정규식
(.*)<FooBar>
일치합니다 :
abcde<FooBar>
그러나 여러 줄에서 어떻게 일치합니까?
abcde
fghij<FooBar>
답변:
언어에 따라 다르지만 정규식 패턴에 추가 할 수있는 수정자가 있어야합니다. PHP에서는 다음과 같습니다.
/(.*)<FooBar>/s
끝에 있는 s 는 점이 개행을 포함한 모든 문자 와 일치하게 합니다 .
s
수정자를 지원하지 않습니다 . 대신 [^]*
같은 효과를냅니다.
m
수정자를 사용하십시오
이 시도:
((.|\n)*)<FooBar>
기본적으로 "모든 문자 또는 줄 바꾸기"는 0 번 이상 반복되었습니다.
((.|\n|\r)*)<FooBar>
[\s\S]*
또는을 사용하십시오 (?s).*
.
문제는 어떤.
패턴과 도 일치 할 수 있다는 것 입니다 문자 있습니까? 답은 엔진마다 다릅니다. 주요 차이점은 패턴이 POSIX 또는 비 POSIX 정규식 라이브러리에서 사용되는지 여부입니다.
에 대한 특별 참고 사항 루아 패턴: 정규식으로 간주되지 않지만 .
POSIX 기반 엔진과 동일한 문자와 일치합니다.
다른 메모 MATLAB 과 옥타브: .
기본적으로 모든 문자와 일치합니다 ( demo ) : str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match');
( 항목 tokens
포함 abcde\n fghij
).
또한 후원의 정규식 문법은 기본적으로 점이 줄 바꿈과 일치합니다. Boost의 ECMAScript 문법을 사용하면 regex_constants::no_mod_m
( source ) 로이 기능을 끌 수 있습니다 .
에 관해서 신탁(POSIX 기반) n
옵션 ( demo )을 사용하십시오.select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dual
POSIX 기반 엔진 :
단지 .
이미 줄 바꿈과 일치하며 수정자를 사용할 필요가 없습니다.세게 때리다( 데모 ).
그만큼 tcl( 데모 )postgresql( 데모 )아르 자형(TRE, no 기본 R 기본 엔진 perl=TRUE
, stringr / stringi 패턴 이 perl=TRUE
있거나 기본 R의 경우 인라인 수정자를 사용하십시오 ) ( demo )도 같은 방식으로 처리 하십시오. (?s)
.
그러나 대부분의 POSIX 기반 도구는 입력을 한 줄씩 처리합니다. 따라서 .
범위에 속하지 않기 때문에 줄 바꿈과 일치하지 않습니다. 이를 무시하는 몇 가지 예는 다음과 같습니다.
sed 'H;1h;$!d;x; s/\(.*\)><Foobar>/\1/'
( H;1h;$!d;x;
파일을 메모리에 넣습니다). 전체 줄을 포함해야하는 경우 sed '/start_pattern/,/end_pattern/d' file
(시작에서 제거하면 일치하는 줄이 포함 된 것으로 끝남) 또는 sed '/start_pattern/,/end_pattern/{{//!d;};}' file
(일치하는 줄을 제외하고) 고려할 수 있습니다.perl -0pe 's/(.*)<FooBar>/$1/gs' <<< "$str"
( -0
전체 파일을 메모리에 넣고,에 -p
의해 제공된 스크립트를 적용한 후 파일을 인쇄합니다 -e
). 을 사용 -000pe
하면 파일이 문지르고 Perl이 연속 줄 바꿈 ( \n\n
)을 레코드 구분 기호로 사용하는 '단락 모드'를 활성화 합니다.grep -Poz '(?si)abc\K.*?(?=<Foobar>)' file
. 여기에서 z
파일 슬러 핑을 (?s)
활성화하고, .
패턴에 대해 DOTALL 모드를 활성화하고 , (?i)
대소 문자를 구분하지 않는 모드를 활성화 \K
하고, 지금까지 일치하는 텍스트를 생략하고 *?
, 게으른 수량 자이며, (?=<Foobar>)
이전 위치와 일치합니다 <Foobar>
.pcregrep -Mi "(?si)abc\K.*?(?=<Foobar>)" file
( M
여기서 파일 슬러 핑을 활성화합니다). 참고 pcregrep
는 Mac OS grep
사용자에게 좋은 솔루션입니다 .POSIX 기반이 아닌 엔진 :
s
수정 자 PCRE_DOTALL 수정 자 사용 : preg_match('~(.*)<Foobar>~s', $s, $m)
( 데모 )RegexOptions.Singleline
플래그 ( 데모 ) : var result = Regex.Match(s, @"(.*)<Foobar>", RegexOptions.Singleline).Groups[1].Value;
var result = Regex.Match(s, @"(?s)(.*)<Foobar>").Groups[1].Value;
(?s)
인라인 옵션 사용 :$s = "abcde`nfghij<FooBar>"; $s -match "(?s)(.*)<Foobar>"; $matches[1]
s
수정 자 (또는 (?s)
시작시 인라인 버전) 사용 ( 데모 ) :/(.*)<FooBar>/s
re.DOTALL
(또는 re.S
) 또는 (?s)
인라인 수정 자 ( demo )를 사용합니다 m = re.search(r"(.*)<FooBar>", s, flags=re.S)
(그리고 if m:
, print(m.group(1))
)Pattern.DOTALL
수정 자 (또는 인라인 (?s)
플래그) 사용 ( demo ) :Pattern.compile("(.*)<FooBar>", Pattern.DOTALL)
(?s)
패턴 내 수정 자 사용 ( demo ) :regex = /(?s)(.*)<FooBar>/
(?s)
수정 자 사용 ( demo ) :"(?s)(.*)<Foobar>".r.findAllIn("abcde\n fghij<Foobar>").matchData foreach { m => println(m.group(1)) }
[^]
또는 해결 방법 [\d\D]
/ [\w\W]
/ [\s\S]
( 데모 ) :s.match(/([\s\S]*)<FooBar>/)[1]
std::regex
) 사용 [\s\S]
또는 JS 해결 방법 ( 데모 ) :regex rex(R"(([\s\S]*)<FooBar>)");
VBA vbscript-JavaScript에서와 동일한 방법을 사용하십시오 ([\s\S]*)<Foobar>
. ( 참고 : 객체 의 MultiLine
속성
RegExp
은 때로는 .
줄 바꿈 을 통해 일치 시킬 수있는 옵션으로 잘못 간주되는 반면, 실제로 는 JS 정규 표현식에서와 같이 문자열이 아닌 줄의 시작 / 끝과 일치하도록 행동 ^
과 $
행동 만 변경합니다 ) 행동.)
루비/m
-MULTILINE 수정 자 사용 ( demo ) :s[/(.*)<Foobar>/m, 1]
(?s)
: regmatches(x, regexec("(?s)(.*)<FooBar>",x, perl=TRUE))[[1]][2]
( 데모 )stringr
/ stringi
regex 기능은 다음을 사용합니다 (?s)
. stringr::str_match(x, "(?s)(.*)<FooBar>")[,2]
( 데모 )(?s)
시작할 때 인라인 수정자를 사용하십시오 ( demo ) :re: = regexp.MustCompile(`(?s)(.*)<FooBar>`)
dotMatchesLineSeparators
또는 (?s)
인라인 수정자를 패턴에 전달하십시오 .let rx = "(?s)(.*)<Foobar>"
(?s)
가장 쉽게 작동하지만 다음은 옵션 사용 방법입니다 .NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:NSRegularExpressionDotMatchesLineSeparators error:®exError];
(?s)
수정 자 사용 ( demo ) : "(?s)(.*)<Foobar>"
(Google Spreadsheets에서 =REGEXEXTRACT(A2,"(?s)(.*)<Foobar>")
)참고 사항(?s)
:
POSIX가 아닌 대부분의 엔진에서 (?s)
인라인 수정 자 (또는 임베디드 플래그 옵션)를 사용하여 .
줄 바꿈을 일치 시킬 수 있습니다 .
패턴의 시작 부분에 배치되면 패턴 (?s)
의 모든 바하 비어가 변경 .
됩니다. 를 (?s)
시작 후 어딘가에 배치 하면 패턴이 Python에 전달 되지 않는 한.
오른쪽에있는 것만 영향을받습니다 . Python에서는 위치에 관계없이 전체 패턴 이 영향을받습니다. 를 사용하여 효과를 중지 합니다. 수정 된 그룹은 지정된 범위의 정규 표현식 패턴에만 영향을 미치기 위해 사용될 수 있습니다 (예 : 개행 에서 첫 번째 일치를 만들고 두 번째 행은 나머지 행과 만 일치).re
re
(?s)
.
(?s)
(?-s)
Delim1(?s:.*?)\nDelim2.*
.*?
.*
POSIX 참고 :
POSIX가 아닌 정규식 엔진에서는 모든 문자와 일치하도록 [\s\S]
/ [\d\D]
/ [\w\W]
구문을 사용할 수 있습니다.
POSIX에서는 [\s\S]
정규 표현식 이스케이프 시퀀스가 대괄호 표현식 내에서 지원되지 않기 때문에 JavaScript 또는 POSIX 엔진이 아닌 다른 문자와 일치하지 않습니다. [\s\S]
단일 문자와 일치하는 대괄호 표현식으로 구문 분석 \
되거나s
또는 S
.
#define MOD regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_m
를 반영하기 위해 해당 정규 표현식 플래그에 대한 기본 플래그 정의 를 설정 합니다. 그리고 중재자는 항상 인라인 수정 자입니다. (?-sm)(?s).*
리셋되는 곳 .
.
. 이 온라인 Bash 데모를 참조하십시오 .
Go
답변 에 포함 시키는 것에 대한 찬사와 추가 투표 !
Eclipse 검색을 사용하는 경우 "DOTALL"옵션을 사용하여 '.'을 만들 수 있습니다. 줄 구분자를 포함한 모든 문자와 일치 : 검색 문자열의 시작 부분에 "(? s)"를 추가하십시오. 예:
(?s).*<FooBar>
(?s)
=>(?m)
"."
일반적으로 줄 바꿈과 일치하지 않습니다. 대부분의 정규식 엔진을 사용하면 S
-flag ( DOTALL
및 라고도 함 SINGLELINE
)를 추가하여 줄 "."
바꿈과 일치 시킬 수 있습니다. 실패하면 다음과 같이 할 수 [\S\s]
있습니다.
/(.*)<FooBar>/s
s는 도트 (.)가 캐리지 리턴과 일치하게합니다.
s
플래그, PCRE 존재 (Perl과 PHP에서 사용할 수있는) 가장 완벽한 엔진. PCRE에는 10 개의 플래그가 있으며 JavaScript에는 3 개의 플래그 ( gmi
) 만 있습니다.
자바 기반 정규 표현식에서 사용할 수 있습니다 [\s\S]
s
Java에서 패턴에 플래그를 추가 할 수 있고 JavaScript에는 s
플래그 가 없습니다 .
패턴 수정 자 사용 sU는 PHP에서 원하는 매칭을 얻습니다.
preg_match('/(.*)/sU',$content,$match);
http://dreamluverz.com/developers-tools/regex-match-all-include-new-line http://php.net/manual/en/reference.pcre.pattern.modifiers.php
언어 내에서 사용되는 문맥에서 정규식은 줄이 아닌 문자열에 작용합니다. 따라서 입력 문자열에 여러 줄이 있다고 가정하면 정규식을 정상적으로 사용할 수 있어야합니다.
이 경우 "<FooBar>"가 있기 때문에 주어진 정규 표현식은 전체 문자열과 일치합니다. 정규식 구현의 사양에 따라 $ 1 값 ( "(. *)"에서 획득)은 "fghij"또는 "abcde \ nfghij"입니다. 다른 사람들이 말했듯이 일부 구현에서는 "."여부를 제어 할 수 있습니다. 개행과 일치하여 선택을 제공합니다.
라인 기반 정규 표현식 사용은 일반적으로 egrep와 같은 명령 행에 사용됩니다.
나는 같은 문제가 있었고 아마도 최선의 방법은 아니지만 작동합니다. 실제 경기를하기 전에 모든 줄 바꿈을 교체했습니다.
mystring= Regex.Replace(mystring, "\r\n", "")
이 경우 줄 바꿈이 실제로 중요하지 않도록 HTML을 조작하고 있습니다.
나는 위의 모든 제안을 운없이 시도했지만 .Net 3.5 FYI를 사용하고 있습니다.
(\s|\S)
나를 위해 속임수를 쓰는 것 같습니다!
(?s)
시키는 데 사용 .
하십시오. 사용하지 않으면 (\s|\S)
성능이 저하됩니다.
Javascript에서는 [^] *를 사용하여 줄 바꿈을 포함하여 0에서 무한 문자를 검색 할 수 있습니다.
$("#find_and_replace").click(function() {
var text = $("#textarea").val();
search_term = new RegExp("[^]*<Foobar>", "gi");;
replace_term = "Replacement term";
var new_text = text.replace(search_term, replace_term);
$("#textarea").val(new_text);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="find_and_replace">Find and replace</button>
<br>
<textarea ID="textarea">abcde
fghij<Foobar></textarea>
일반적으로 . 줄 바꿈과 일치하지 않으므로 시도하십시오.((.|\n)*)<foobar>
\r
:.((?:.|\r?\n)*)<foobar>
종종 우리는 하위 문자열 앞의 행에 몇 개의 키워드를 사용하여 하위 문자열을 수정해야합니다. xml 요소를 고려하십시오.
<TASK>
<UID>21</UID>
<Name>Architectural design</Name>
<PercentComplete>81</PercentComplete>
</TASK>
81을 다른 값 (40)으로 수정하려고한다고 가정합니다. 먼저을 식별 .UID.21..UID.
한 다음 \n
까지를 포함한 모든 문자를 건너 뜁니다 .PercentCompleted.
. 정규식 패턴과 바꾸기 사양은 다음과 같습니다.
String hw = new String("<TASK>\n <UID>21</UID>\n <Name>Architectural design</Name>\n <PercentComplete>81</PercentComplete>\n</TASK>");
String pattern = new String ("(<UID>21</UID>)((.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
String replaceSpec = new String ("$1$2$440$6");
//note that the group (<PercentComplete>) is $4 and the group ((.|\n)*?) is $2.
String iw = hw.replaceFirst(pattern, replaceSpec);
System.out.println(iw);
<TASK>
<UID>21</UID>
<Name>Architectural design</Name>
<PercentComplete>40</PercentComplete>
</TASK>
하위 그룹 (.|\n)
이 누락 된 그룹 일 수 $3
있습니다. 우리가하여 비 캡처 할 경우 (?:.|\n)
다음은 $3
입니다 (<PercentComplete>)
. 따라서 패턴은 다음과 replaceSpec
같습니다.
pattern = new String("(<UID>21</UID>)((?:.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
replaceSpec = new String("$1$2$340$5")
교체는 이전과 같이 올바르게 작동합니다.
일반적으로 Powershell에서 3 개의 연속 라인을 검색하면 다음과 같습니다.
$file = get-content file.txt -raw
$pattern = 'lineone\r\nlinetwo\r\nlinethree\r\n' # "windows" text
$pattern = 'lineone\nlinetwo\nlinethree\n' # "unix" text
$pattern = 'lineone\r?\nlinetwo\r?\nlinethree\r?\n' # both
$file -match $pattern
# output
True
기괴하게도 이것은 프롬프트에서 유닉스 텍스트이지만 파일의 텍스트는 Windows입니다.
$pattern = 'lineone
linetwo
linethree
'
줄 끝을 인쇄하는 방법은 다음과 같습니다.
'lineone
linetwo
linethree
' -replace "`r",'\r' -replace "`n",'\n'
# output
lineone\nlinetwo\nlinethree\n