例如,这regex

(.*)<FooBar>

将匹配:

abcde<FooBar>

但是我怎么得到它以配合跨越多条线路?

abcde
fghij<FooBar>
有帮助吗?

解决方案

这取决于语言,但应该有一个可以添加到正则表达式模式的修饰符。在PHP中它是:

/(.*)<FooBar>/s

最后的 s 会使点匹配所有字符,包括换行符。

其他提示

试试这个:

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

它基本上表示“任何字符或换行符”。重复零次或多次。

如果您正在使用Eclipse搜索,则可以启用“DOTALL”。制作'。'的选项匹配任何字符,包括行分隔符:只需添加“(?s)”;在搜索字符串的开头。示例:

(?s).*<FooBar>

问题是,可以 . 模式匹配 任何 角色?答案不同,从引擎引擎。主要的差别是模式是否是用于通过POSIX或非POSIX regex library.

特别注意有关 :他们不考虑经常表达形式,但是 . 匹配的任何char有相同POSIX基础的引擎。

另一个注意 :的 . 匹配的任何char通过默认(演示): str = "abcde\n fghij<Foobar>"; expression = '(.*)<Foobar>*'; [tokens,matches] = regexp(str,expression,'tokens','match'); (tokens 包含一个 abcde\n fghij 项目)。

此外,在所有的 's regex法的点相匹配的行符的默认。提高的写法允许你打开这一关 regex_constants::no_mod_m (来源).

作为对 (它是POSIX的基础),使用 n 选项 (演示): select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dual

POSIX基于引擎:

仅仅是 . 已经匹配线断裂,没有必要使用任何调节剂,请参阅 (演示).

(演示), (演示), (TRE、基R默认没有引擎 perl=TRUE, 为基R与 perl=TRUEstringr/stringi 模式,使用 (?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 是一个很好的解决方案for 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) 内联修改(演示): m = re.search(r"(.*)<FooBar>", s, flags=re.S) (然后 if m:, print(m.group(1)))
  • -使用 Pattern.DOTALL 修改(或内联 (?s) 标志)(演示): Pattern.compile("(.*)<FooBar>", Pattern.DOTALL)
  • -使用 (?s) 在模式的修改(演示): regex = /(?s)(.*)<FooBar>/
  • -使用 (?s) 修改(演示): "(?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>)");
  • -使用同样的方法作为在JavaScript, ([\s\S]*)<Foobar>.
  • -使用 /m 多行 修改 (演示): s[/(.*)<Foobar>/m, 1]
  • -使用内联修改 (?s) 在开始(演示): re: = regexp.MustCompile(`(?s)(.*)<FooBar>`)
  • -使用 dotMatchesLineSeparators 或者(更)通过 (?s) 内联修改的图案: let rx = "(?s)(.*)<Foobar>"
  • -同样迅速的, (?s) 作的最简单,但在这里是怎样的 选项,可以使用: NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:&regexError];
  • , -使用 (?s) 修改(演示): "(?s)(.*)<Foobar>" (在谷歌的电子表格, =REGEXEXTRACT(A2,"(?s)(.*)<Foobar>"))

注意到上 (?s):

在大多数非POSIX引擎, (?s) 内联修改(或嵌入式标志的选择)可以用来强制执行 . 匹配线断裂。

如果放在一开始的模式, (?s) 改变了某切 . 在模式。如果的 (?s) 放置在什么地方开始后,只有那些 . 将会受到影响,位于右侧 除非 这是一模式传递给蟒蛇 re.在蟒蛇 re, 无论 (?s) 位置,整个图案 . 都会受到影响。的 (?s) 效果是停止使用 (?-s).一个修改组可以被用来仅会影响一定范围的regex案(例如 Delim1(?s:.*?)\nDelim2.* 将会使第一 .*? 匹配的跨新行和第二 .* 只会的其余部分相匹配的线)。

POSIX注意:

在非regex引擎,以配合任何char, [\s\S] / [\d\D] / [\w\W] 结构可以使用。

在POSIX, [\s\S] 是不匹配的任何char(如在JavaScript或任何非POSIX引擎),因为regex逃序列不支持内部架表达。 [\s\S] 是分析为支架式匹配一个单一的字符, \sS.

在JavaScript中,使用 / [\ S \ s] *&lt; Foobar&gt; / 来源

<代码>([\ S \ S] *)&LT; FooBar的&GT;

该点匹配除换行符之外的所有内容(\ r \ n)。所以使用\ s \ S,它将匹配所有字符。

红宝石 你可以使用'm 选项(多行):

/YOUR_REGEXP/m

看看 表示式的文档 上ruby-doc.org 更多的信息。

我们也可以使用

(.*?\n)*?

匹配所有内容,包括没有贪婪的换行符

这将使新行可选

(.*?|\n)*?

&quot;。&quot; 通常与换行符不匹配。大多数正则表达式引擎允许您添加 S -flag(也称为 DOTALL SINGLELINE )以生成&quot;。&quot; 也匹配换行符。 如果失败,您可以执行类似 [\ S \ s]

的操作

对于Eclipse,使用以下表达式:

  

     

jadajada Bar&quot;

正则表达式:

Foo[\S\s]{1,10}.*Bar*
/(.*)<FooBar>/s

s导致Dot(。)匹配回车

在基于java的正则表达式中,您可以使用 [\ s \ S]

请注意,(。| \ n)* 的效率可能低于(例如) [\ s \ S] * (如果您的语言的正则表达式支持此类转义)而不是找到如何指定制作的修饰符。也匹配换行符。或者您可以使用POSIXy替代方案,例如 [[:space:] [:^ space:]] *

使用RegexOptions.Singleline,它改变了含义。包括换行符

Regex.Replace(content,searchText,replaceText,RegexOptions.Singleline);

解决方案:

使用模式修饰符sU将在PHP中获得所需的匹配。

例如:

preg_match('/(.*)/sU',$content,$match);

来源:

http://dreamluverz.com/developers-tools/正则表达式匹配 - 所有 - 包括全新的行 http://php.net/manual/en/reference.pcre.pattern .modifiers.php

在语言中使用的上下文中,正则表达式作用于字符串,而不是行。所以你应该能够正常使用正则表达式,假设输入字符串有多行。

在这种情况下,给定的正则表达式将匹配整个字符串,因为“&lt; FooBar&gt;”存在。根据正则表达式实现的细节,$ 1值(从“(。*)”获得)将是“fghij”。或“abcde \ nfghij”。正如其他人所说,某些实现允许您控制是否“。”。将与换行符匹配,为您提供选择。

基于行的正则表达式通常用于像egrep这样的命令行。

我遇到了同样的问题并且解决了它可能不是最好的方法,但它的工作原理。在我完成真正的比赛之前,我替换了所有换行符:

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

我正在操纵HTML,所以在这种情况下换行并不重要。

我尝试了上述所有建议但没有运气,我正在使用.Net 3.5 FYI

在Javascript中,您可以使用[^] *搜索零到无限字符,包括换行符。

$("#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>

一般来说。与换行符不匹配,请尝试((。| \ n)*)&lt; foobar&gt;

我想匹配java中的特定if块

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

   }
...
...
}

如果我使用regExp

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

它包含方法块的右括号,所以我使用了

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

从通配符匹配中排除右括号。

通常我们必须修改一个子字符串,其中几个关键字分布在子字符串之前的行。考虑一个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 (&lt; PercentComplete&gt;)。因此模式和 replaceSpec 也可以是:

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

并且替换工作正常。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top