Làm cách nào để khớp bất kỳ ký tự nào trên nhiều dòng trong biểu thức chính quy?


356

Ví dụ, regex này

(.*)<FooBar>

sẽ phù hợp:

abcde<FooBar>

Nhưng làm thế nào để tôi có được nó phù hợp trên nhiều dòng?

abcde
fghij<FooBar>

1
Làm rõ; Ban đầu tôi sử dụng Eclipse để tìm và thay thế trong nhiều tệp. Những gì tôi đã phát hiện ra bởi các câu trả lời dưới đây là vấn đề của tôi là công cụ chứ không phải mô hình regex.
andyuk

2
Cờ của bạn "nhật thực" nên được gỡ bỏ sau đó bởi vì một người tìm kiếm giải pháp nhật thực sẽ tìm thấy câu hỏi này (giống như tôi đã làm) và sau đó tìm một giải pháp không nhật thực như được chấp nhận.
acme

2
Bây giờ tôi đang tìm thấy điều này trong công cụ tìm kiếm vì nhật thực đã được đề cập. Ôi nỗi kinh hoàng.
Brian Olsen

Câu trả lời:


240

Nó phụ thuộc vào ngôn ngữ, nhưng cần có một công cụ sửa đổi mà bạn có thể thêm vào mẫu biểu thức chính quy. Trong PHP nó là:

/(.*)<FooBar>/s

Các s ở cuối làm cho dấu chấm khớp với tất cả các ký tự bao gồm cả dòng mới.


và nếu tôi chỉ muốn một dòng mới và không phải tất cả các nhân vật thì sao?
Grace

3
@Grace: sử dụng \ n để khớp với một dòng mới
Jeremy Ruten

5
Cờ s (hiện tại?) Không hợp lệ, ít nhất là trong Chrome / V8. Thay vào đó, hãy sử dụng / ([\ s \ S] *) <FooBar> / lớp nhân vật (khớp không gian và không phải dấu cách] thay cho trình so khớp thời gian. Xem các câu trả lời khác để biết thêm thông tin.
Allen

8
@ ALLen - JavaScript không hỗ trợ công cụ ssửa đổi. Thay vào đó, làm [^]*cho hiệu quả tương tự.
Derek 朕 會

1
Trong Ruby, sử dụng công cụ msửa đổi
Ryan Buckley

358

Thử cái này:

((.|\n)*)<FooBar>

Về cơ bản, nó nói "bất kỳ ký tự hoặc một dòng mới" lặp đi lặp lại từ 0 lần trở lên.


5
Điều này phụ thuộc vào ngôn ngữ và / hoặc công cụ bạn đang sử dụng. Vui lòng cho chúng tôi biết những gì bạn đang sử dụng, ví dụ Perl, PHP, CF, C #, sed, awk, v.v.
Ben Doom

39
Tùy thuộc vào kết thúc dòng của bạn, bạn có thể cần((.|\n|\r)*)<FooBar>
Potherca

3
Ông nói rằng ông đang sử dụng Eclipse. Đây là giải pháp chính xác theo ý kiến ​​của tôi. Tôi có cùng một vấn đề và điều này đã giải quyết nó.
Thủy thủ Danubian

4
Phải - câu hỏi là về nhật thực và các thẻ cũng vậy. Nhưng giải pháp được chấp nhận là một giải pháp PHP. Bạn nên là giải pháp được chấp nhận ...
acme

16
Đây là regex tệ nhất để khớp nhiều đầu vào. Vui lòng không bao giờ sử dụng nó trừ khi bạn đang sử dụng ElasticSearch. Sử dụng [\s\S]*hoặc (?s).*.
Wiktor Stribiżew

88

Câu hỏi là, .mô hình có thể phù hợp với bất kỳ nhân vật? Câu trả lời khác nhau từ động cơ đến động cơ. Sự khác biệt chính là liệu mẫu được sử dụng bởi thư viện regex POSIX hay không POSIX.

Lưu ý đặc biệt về : chúng không được coi là biểu thức chính quy, nhưng .khớp với bất kỳ char nào ở đó, giống như các công cụ dựa trên POSIX.

Một lưu ý khác về : .phù hợp với bất kỳ char theo mặc định ( demo ): str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match');( tokenschứa một abcde\n fghijmục).

Ngoài ra, trong tất cả các Theo mặc định, ngữ pháp regex của dấu chấm khớp với ngắt dòng theo mặc định. Ngữ pháp ECMAScript của Boost cho phép bạn tắt tính năng này bằng regex_constants::no_mod_m( nguồn ).

Đối với (dựa trên POSIX), sử dụng ntùy chọn ( bản demo ):select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dual

Động cơ dựa trên POSIX :

Chỉ đơn giản là .đã khớp dòng ngắt, không cần sử dụng bất kỳ sửa đổi nào, xem( bản demo ).

Các ( bản demo ),( bản demo ),(TRE, cơ sở R engine mặc định không có perl=TRUE, đối với cơ sở R với perl=TRUEhoặc cho stringr / stringi mẫu, sử dụng (?s)modifier inline) ( bản demo ) cũng đối xử .theo cùng một cách.

Tuy nhiên , hầu hết các công cụ dựa trên POSIX xử lý từng dòng đầu vào. Do đó, .không khớp với các ngắt dòng chỉ vì chúng không nằm trong phạm vi. Dưới đây là một số ví dụ về cách ghi đè này:

  • - Có nhiều cách giải quyết, chính xác nhất nhưng không an toàn lắm sed 'H;1h;$!d;x; s/\(.*\)><Foobar>/\1/'( H;1h;$!d;x;nhét tệp vào bộ nhớ). Nếu phải bao gồm toàn bộ các dòng, sed '/start_pattern/,/end_pattern/d' file(loại bỏ khỏi bắt đầu sẽ kết thúc với các dòng phù hợp được bao gồm) hoặc sed '/start_pattern/,/end_pattern/{{//!d;};}' file(với các dòng phù hợp được loại trừ) có thể được xem xét.
  • - perl -0pe 's/(.*)<FooBar>/$1/gs' <<< "$str"( -0nhét toàn bộ tệp vào bộ nhớ, -pin tệp sau khi áp dụng tập lệnh được cung cấp bởi -e). Lưu ý rằng việc sử dụng -000pesẽ làm mờ tệp và kích hoạt mode chế độ đoạn 'trong đó Perl sử dụng các dòng mới liên tiếp ( \n\n) làm dấu tách bản ghi.
  • - grep -Poz '(?si)abc\K.*?(?=<Foobar>)' file. Ở đây, zcho phép ẩn tệp, (?s)bật chế độ DOTALL cho .mẫu, bật (?i)chế độ không phân biệt chữ hoa chữ thường, \Kbỏ qua văn bản khớp cho đến nay, *?là một bộ định lượng lười biếng, (?=<Foobar>)khớp với vị trí trước đó <Foobar>.
  • - pcregrep -Mi "(?si)abc\K.*?(?=<Foobar>)" file( Mcho phép tập tin ở đây). Lưu ý pcregreplà một giải pháp tốt cho grepngười dùng Mac OS .

Xem bản demo .

Động cơ không dựa trên POSIX :

  • - Sử dụng công cụ ssửa đổi PCRE_DOTALL : preg_match('~(.*)<Foobar>~s', $s, $m)( bản demo )
  • - Sử dụng RegexOptions.Singlelinecờ ( bản demo ):
    - var result = Regex.Match(s, @"(.*)<Foobar>", RegexOptions.Singleline).Groups[1].Value;
    -var result = Regex.Match(s, @"(?s)(.*)<Foobar>").Groups[1].Value;
  • - Sử dụng (?s)tùy chọn nội tuyến:$s = "abcde`nfghij<FooBar>"; $s -match "(?s)(.*)<Foobar>"; $matches[1]
  • - Sử dụng công cụ ssửa đổi (hoặc (?s)phiên bản nội tuyến khi bắt đầu) ( bản demo ):/(.*)<FooBar>/s
  • - Sử dụng re.DOTALL(hoặc re.S) cờ hoặc công cụ (?s)sửa đổi nội tuyến ( bản demo ): m = re.search(r"(.*)<FooBar>", s, flags=re.S)(và sau đó if m:, print(m.group(1)))
  • - Sử dụng công cụ Pattern.DOTALLsửa đổi (hoặc (?s)cờ nội tuyến ) ( bản demo ):Pattern.compile("(.*)<FooBar>", Pattern.DOTALL)
  • - Sử dụng (?s)công cụ sửa đổi trong mẫu ( bản demo ):regex = /(?s)(.*)<FooBar>/
  • - Sử dụng công cụ (?s)sửa đổi ( bản demo ):"(?s)(.*)<Foobar>".r.findAllIn("abcde\n fghij<Foobar>").matchData foreach { m => println(m.group(1)) }
  • - Sử dụng [^]hoặc giải pháp [\d\D]/ [\w\W]/ [\s\S]( bản demo ):s.match(/([\s\S]*)<FooBar>/)[1]
  • ( std::regex) Sử dụng [\s\S]hoặc cách giải quyết của JS ( bản demo ):regex rex(R"(([\s\S]*)<FooBar>)");
  • - Sử dụng cách tiếp cận tương tự như trong JavaScript , ([\s\S]*)<Foobar>. ( LƯU Ý : MultiLineThuộc tính của RegExpđối tượng đôi khi bị nhầm là tùy chọn cho phép .khớp giữa các ngắt dòng, trong khi thực tế, nó chỉ thay đổi hành vi ^$hành vi để khớp với bắt đầu / kết thúc của dòng chứ không phải trong chuỗi regex ) hành vi.)

  • - Sử dụng công cụ sửa đổi /m MULTILINE ( bản demo ):s[/(.*)<Foobar>/m, 1]

  • - Biểu thức cơ sở PCRE R - sử dụng (?s): regmatches(x, regexec("(?s)(.*)<FooBar>",x, perl=TRUE))[[1]][2]( bản demo )
  • - các chức năng trong stringr/ stringiregex được cung cấp bởi công cụ regex ICU, cũng sử dụng (?s): stringr::str_match(x, "(?s)(.*)<FooBar>")[,2]( bản demo )
  • - Sử dụng công cụ sửa đổi nội tuyến (?s)khi bắt đầu ( bản demo ):re: = regexp.MustCompile(`(?s)(.*)<FooBar>`)
  • - Sử dụng dotMatchesLineSeparatorshoặc (dễ dàng hơn) chuyển công cụ (?s)sửa đổi nội tuyến cho mẫu:let rx = "(?s)(.*)<Foobar>"
  • - Giống như Swift, (?s)hoạt động dễ nhất, nhưng đây là cách tùy chọn có thể được sử dụng :NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:&regexError];
  • , - Sử dụng công cụ (?s)sửa đổi ( bản demo ): "(?s)(.*)<Foobar>"(trong Bảng tính Google, =REGEXEXTRACT(A2,"(?s)(.*)<Foobar>"))

GHI CHÚ(?s) :

Trong hầu hết các công cụ không phải POSIX, công cụ (?s)sửa đổi nội tuyến (hoặc tùy chọn cờ nhúng) có thể được sử dụng để thực thi .để khớp dòng ngắt.

Nếu được đặt ở đầu mẫu, (?s)thay đổi giá trị của tất cả .trong mẫu. Nếu cái (?s)được đặt ở đâu đó sau khi bắt đầu, chỉ những cái đó .sẽ bị ảnh hưởng nằm ở bên phải của nó trừ khi đây là mẫu được truyền cho Python re. Trong Python re, bất kể (?s)vị trí, toàn bộ mô hình .đều bị ảnh hưởng. Các (?s)hiệu ứng được ngừng sử dụng (?-s). Một nhóm được sửa đổi có thể được sử dụng để chỉ ảnh hưởng đến một phạm vi xác định của mẫu biểu thức chính quy (ví dụ: Delim1(?s:.*?)\nDelim2.*sẽ tạo .*?kết quả khớp đầu tiên trên các dòng mới và nhóm thứ hai .*sẽ chỉ khớp với phần còn lại của dòng).

Lưu ý POSIX :

Trong các công cụ regex không POSIX, để phù hợp với bất kỳ cấu trúc char, [\s\S]/ [\d\D]/ [\w\W]có thể được sử dụng.

Trong POSIX, [\s\S]không khớp với bất kỳ char nào (như trong JavaScript hoặc bất kỳ công cụ không phải POSIX nào) vì các chuỗi thoát regex không được hỗ trợ bên trong các biểu thức ngoặc. [\s\S]được phân tích cú pháp dưới dạng biểu thức ngoặc khớp với một char \hoặc shoặc S.


5
Bạn nên liên kết đến tổng quan tuyệt vời này từ trang hồ sơ của bạn hoặc một cái gì đó (+1).
Ngày

1
Bạn có thể muốn thêm phần này vào mục boost : Trong không gian tên regex_constants, flag_type_'s: perl = ECMAScript = JavaScript = JScript = :: boost :: regbase :: normal = 0, mặc định là Perl. Các lập trình viên sẽ đặt định nghĩa cờ cơ sở #define MOD regex_constants::perl | boost::regex::no_mod_s | boost::regex::no_mod_mcho các cờ regex của họ để phản ánh điều đó. Và arbitor luôn là công cụ sửa đổi nội tuyến. Nơi (?-sm)(?s).*đặt lại.

1
Bạn cũng có thể thêm cho bash xin vui lòng?
Pasupathi Rajamanickam 19/12/18

2
@PasupathiRajamanickam Bash sử dụng công cụ regex POSIX, .phù hợp với bất kỳ char nào ở đó (bao gồm cả ngắt dòng). Xem bản demo Bash trực tuyến này .
Wiktor Stribiżew 19/12/18

1
Bạn rock - đây là hướng dẫn nhỏ đầy đủ nhất về regrec phức tạp (tương đối) mà tôi từng thấy. Bạn xứng đáng với câu trả lời của bạn trở thành câu trả lời được chấp nhận! Kudos và phiếu bầu thêm cho bao gồm Gotrong câu trả lời!
Gwyneth Llewelyn

68

Nếu bạn đang sử dụng tìm kiếm Eclipse, bạn có thể kích hoạt tùy chọn "DOTALL" để tạo '.' khớp với bất kỳ ký tự nào, kể cả các dấu phân cách dòng: chỉ cần thêm "(? s)" vào đầu chuỗi tìm kiếm của bạn. Thí dụ:

(?s).*<FooBar>

1
Không phải ở bất cứ đâu, chỉ trong các hương vị regex hỗ trợ các sửa đổi nội tuyến, và chắc chắn không có trong Ruby ở đâu (?s)=>(?m)
Wiktor Stribiżew 18/07/2016

Bất cứ điều gì cho bash?
Pasupathi Rajamanickam 19/12/18

38

Trong nhiều phương ngữ regex, /[\S\s]*<Foobar>/sẽ làm những gì bạn muốn. Nguồn


2
Từ liên kết đó: "JavaScript và VBScript không có tùy chọn để tạo các ký tự ngắt dòng khớp. Trong các ngôn ngữ đó, bạn có thể sử dụng một lớp ký tự như [\ s \ S] để khớp với bất kỳ ký tự nào." Thay cho . thay vào đó, hãy sử dụng [\ s \ S] (khớp khoảng trắng và không khoảng trắng).
Allen

32

([\s\S]*)<FooBar>

Dấu chấm khớp với tất cả ngoại trừ dòng mới (\ r \ n). Vì vậy, sử dụng \ s \ S, sẽ khớp với TẤT CẢ các ký tự.


Điều này giải quyết vấn đề nếu bạn đang sử dụng Objective-C [text rangeOfString:regEx options:NSRegularExpressionSearch]. Cảm ơn!
J. Costa

1
Điều này hoạt động trong intelliJ's find & thay thế regex, cảm ơn.
barclay

Những công việc này. Nhưng nó cần phải là lần xuất hiện đầu tiên của<FooBar>
Ozkan


13

chúng ta cũng có thể sử dụng

(.*?\n)*?

để phù hợp với tất cả mọi thứ bao gồm cả dòng mới mà không tham lam

Điều này sẽ làm cho dòng mới tùy chọn

(.*?|\n)*?

8

"."thông thường không khớp dòng ngắt. Hầu hết các công cụ regex cho phép bạn thêm S-flag (còn được gọi DOTALLSINGLELINE) để tạo ra các "."dòng mới. Nếu thất bại, bạn có thể làm một cái gì đó như [\S\s].


8

Đối với Eclipse đã làm việc theo biểu thức sau:

Foo

quán bar jadajada "

Biểu hiện thông thường:

Foo[\S\s]{1,10}.*Bar*

5
/(.*)<FooBar>/s

các nguyên nhân khiến Dot (.) khớp với lợi nhuận vận chuyển


Có vẻ như điều này không hợp lệ (Chrome): text.match (/ a / s) Cú pháp: Các cờ không hợp lệ được cung cấp cho nhà xây dựng RegExp '
Allen

Bởi vì nó không được hỗ trợ trong các công cụ JavaScript RegEx. Các scờ tồn tại trong PCRE, công cụ hoàn chỉnh nhất (có sẵn trong Perl và PHP). PCRE có 10 cờ (và rất nhiều tính năng khác) trong khi JavaScript chỉ có 3 cờ ( gmi).
Morgan Todarey Quilling

4

Trong biểu thức chính quy dựa trên java, bạn có thể sử dụng [\s\S]


1
Không phải đó là dấu gạch chéo ngược?
Paul Draper

Chúng đi vào cuối Biểu thức chính quy, không nằm trong. Ví dụ: / blah / s
RandomInsano

Tôi đoán bạn có nghĩa là JavaScript, không phải Java? Vì bạn chỉ có thể thêm scờ vào mẫu trong Java và JavaScript không có scờ.
3limin4t0r

3

Lưu ý rằng (.|\n)*có thể kém hiệu quả hơn (ví dụ) [\s\S]*(nếu regex của ngôn ngữ của bạn hỗ trợ các lối thoát như vậy) và hơn là tìm cách chỉ định công cụ sửa đổi tạo ra. cũng phù hợp với dòng mới. Hoặc bạn có thể đi với các lựa chọn thay thế POSIXy như thế nào [[:space:][:^space:]]*.


3

Sử dụng RegexOptions.Singleline, nó thay đổi ý nghĩa của. để bao gồm các dòng mới

Regex.Replace (nội dung, searchText, thay thế, RegexOptions.Singleline);



1

Trong ngữ cảnh sử dụng trong các ngôn ngữ, các biểu thức chính quy hoạt động trên các chuỗi, không phải các dòng. Vì vậy, bạn sẽ có thể sử dụng regex bình thường, giả sử rằng chuỗi đầu vào có nhiều dòng.

Trong trường hợp này, regex đã cho sẽ khớp với toàn bộ chuỗi, vì "<FooBar>" có mặt. Tùy thuộc vào chi tiết cụ thể của việc triển khai regex, giá trị $ 1 ​​(thu được từ "(. *)") Sẽ là "fghij" hoặc "abcde \ nfghij". Như những người khác đã nói, một số triển khai cho phép bạn kiểm soát xem "." sẽ phù hợp với dòng mới, cho bạn sự lựa chọn.

Việc sử dụng biểu thức chính quy dựa trên dòng thường dành cho những thứ dòng lệnh như egrep.


1

Tôi đã có cùng một vấn đề và giải quyết nó có thể không phải là cách tốt nhất nhưng nó hoạt động. Tôi đã thay thế tất cả các ngắt dòng trước khi tôi thực hiện trận đấu thực sự của mình:

mystring= Regex.Replace(mystring, "\r\n", "")

Tôi đang thao túng HTML để ngắt dòng không thực sự quan trọng với tôi trong trường hợp này.

Tôi đã thử tất cả các đề xuất ở trên mà không gặp may, tôi đang sử dụng .Net 3.5 FYI


Tôi cũng đang sử dụng .NET và (\s|\S)dường như cũng đang lừa tôi!
Vamshi Krishna

@VamshiKrishna Trong .NET, sử dụng (?s)để tạo .bất kỳ ký tự nào. Không sử dụng (\s|\S)sẽ làm chậm hiệu suất.
Wiktor Stribiżew

1

Trong Javascript, bạn có thể sử dụng [^] * để tìm kiếm các ký tự từ 0 đến vô hạn, bao gồm cả ngắt dòng.

$("#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&lt;Foobar&gt;</textarea>


0

nói chung là . không khớp với dòng mới, vì vậy hãy thử((.|\n)*)<foobar>


3
Không, đừng làm vậy. Nếu bạn cần khớp bất cứ thứ gì kể cả dấu phân cách dòng, hãy sử dụng công cụ sửa đổi DOTALL (aka / s hoặc SingleLine). Việc hack (. | \ N) không chỉ làm cho regex kém hiệu quả hơn, thậm chí còn không đúng. Ít nhất, nó phải phù hợp với \ r (vận chuyển trở lại) cũng như \ n (linefeed). Cũng có các ký tự phân cách dòng khác, mặc dù hiếm khi được sử dụng. Nhưng nếu bạn sử dụng cờ DOTALL, bạn không phải lo lắng về chúng.
Alan Moore

1
\ R là kết hợp độc lập với nền tảng cho các dòng mới trong Eclipse.
opyate

@opyate Bạn nên đăng bài này như một câu trả lời vì viên ngọc nhỏ này cực kỳ hữu ích.
jeckhart

Bạn có thể thử điều này thay thế. Nó sẽ không khớp với dấu ngoặc trong và cũng xem xét tùy chọn \r.:((?:.|\r?\n)*)<foobar>
ssc-hrep3

0

Tôi muốn khớp một khối cụ thể trong java

   ...
   ...
   if(isTrue){
       doAction();

   }
...
...
}

Nếu tôi sử dụng regExp

if \(isTrue(.|\n)*}

nó bao gồm dấu ngoặc đóng cho khối phương thức nên tôi đã sử dụng

if \(!isTrue([^}.]|\n)*}

để loại trừ cú đúp kết thúc từ trận đấu ký tự đại diện.


0

Thông thường chúng ta phải sửa đổi một chuỗi con với một vài từ khóa trải đều trên các dòng trước chuỗi con. Hãy xem xét một yếu tố xml:

<TASK>
  <UID>21</UID>
  <Name>Architectural design</Name>
  <PercentComplete>81</PercentComplete>
</TASK>

Giả sử chúng ta muốn sửa đổi 81, thành một số giá trị khác, giả sử 40. Trước tiên .UID.21..UID., xác định , sau đó bỏ qua tất cả các ký tự bao gồm \nđến .PercentCompleted.. Mẫu biểu thức chính quy và đặc tả thay thế là:

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>

Nhóm con (.|\n)có lẽ là nhóm mất tích $3. Nếu chúng ta làm cho nó không bị bắt bởi (?:.|\n)thì đó $3(<PercentComplete>). Vì vậy, mô hình và replaceSpeccũng có thể là:

pattern = new String("(<UID>21</UID>)((?:.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
replaceSpec = new String("$1$2$340$5")

và thay thế hoạt động chính xác như trước.


0

Thông thường tìm kiếm ba dòng liên tiếp trong Powershell, nó sẽ trông như sau:

$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

Kỳ lạ thay, đây sẽ là văn bản unix tại dấu nhắc, nhưng văn bản windows trong một tệp:

$pattern = 'lineone
linetwo
linethree
'

Đây là một cách để in ra các kết thúc dòng:

'lineone
linetwo
linethree
' -replace "`r",'\r' -replace "`n",'\n'

# output
lineone\nlinetwo\nlinethree\n

-2

lựa chọn 1

Một cách sẽ là sử dụng scờ (giống như câu trả lời được chấp nhận):

/(.*)<FooBar>/s

Bản demo 1

Lựa chọn 2

Cách thứ hai sẽ là sử dụng mcờ (multiline) và bất kỳ mẫu nào sau đây:

/([\s\S]*)<FooBar>/m

hoặc là

/([\d\D]*)<FooBar>/m

hoặc là

/([\w\W]*)<FooBar>/m

Bản demo 2

Mạch RegEx

jex.im hình dung các biểu thức thông thường:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.