题
例如,这regex
(.*)<FooBar>
将匹配:
abcde<FooBar>
但是我怎么得到它以配合跨越多条线路?
abcde
fghij<FooBar>
解决方案
这取决于语言,但应该有一个可以添加到正则表达式模式的修饰符。在PHP中它是:
/(.*)<FooBar>/s
最后的 s 会使点匹配所有字符,包括换行符。
其他提示
试试这个:
((.|\n)*)<FooBar>
它基本上表示“任何字符或换行符”。重复零次或多次。
如果您正在使用Eclipse搜索,则可以启用“DOTALL”。制作'。'的选项匹配任何字符,包括行分隔符:只需添加“(?s)”;在搜索字符串的开头。示例:
(?s).*<FooBar>
问题是,可以 .
模式匹配 任何 角色?答案不同,从引擎引擎。主要的差别是模式是否是用于通过POSIX或非POSIX regex library.
特别注意有关 lua模式:他们不考虑经常表达形式,但是 .
匹配的任何char有相同POSIX基础的引擎。
另一个注意 matlab 和 八度:的 .
匹配的任何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
(来源).
作为对 oracle (它是POSIX的基础),使用 n
选项 (演示): select regexp_substr('abcde' || chr(10) ||' fghij<Foobar>', '(.*)<Foobar>', 1, 1, 'n', 1) as results from dual
POSIX基于引擎:
仅仅是 .
已经匹配线断裂,没有必要使用任何调节剂,请参阅 bash (演示).
的 tcl (演示), postgresql (演示), r (TRE、基R默认没有引擎 perl=TRUE
, 为基R与 perl=TRUE
或 stringr/stringi 模式,使用 (?s)
内联修改)(演示)也享 .
同样的方式。
然而, 最POSIX基础的工具过程的输入。因此, .
不匹配的行符,只是因为他们不是在范围。这里是一些例子如何复盖这一点:
- sed -有多种变通办法,最精确但不是很安全
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 -
perl -0pe 's/(.*)<FooBar>/$1/gs' <<< "$str"
(-0
吸食整个文件放入存储器,-p
打印文件的文件之后施加的剧本给过-e
).注意使用-000pe
将吃的文件和活'段模式在哪里Perl采用连续的新行(\n\n
)作为记录的分离器。 - gnu-查询 -
grep -Poz '(?si)abc\K.*?(?=<Foobar>)' file
.在这里,z
使文件啜,(?s)
使DOTALL模式.
模式,(?i)
使情况不敏感的方式,\K
省略了匹配的文本迄今为止,*?
是一个懒惰量词,(?=<Foobar>)
相匹配的位置之前<Foobar>
. - pcregrep -
pcregrep -Mi "(?si)abc\K.*?(?=<Foobar>)" file
(M
使文件啜这里)。注意到pcregrep
是一个很好的解决方案for Mac OSgrep
用户。
看看演示.
非POSIX基于引擎:
- php -使用
s
修改 PCRE_DOTALL修改:preg_match('~(.*)<Foobar>~s', $s, $m)
(演示) - c# -使用
RegexOptions.Singleline
标志(演示):
-var result = Regex.Match(s, @"(.*)<Foobar>", RegexOptions.Singleline).Groups[1].Value;
-var result = Regex.Match(s, @"(?s)(.*)<Foobar>").Groups[1].Value;
- powershell -使用
(?s)
内嵌的选择:$s = "abcde`nfghij<FooBar>"; $s -match "(?s)(.*)<Foobar>"; $matches[1]
- perl -使用
s
修改(或(?s)
线版本的开始时)(演示):/(.*)<FooBar>/s
- 蟒蛇 -使用
re.DOTALL
(或re.S
)标志或(?s)
内联修改(演示):m = re.search(r"(.*)<FooBar>", s, flags=re.S)
(然后if m:
,print(m.group(1))
) - java -使用
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)) }
- javascript -使用
[^]
或替代方法[\d\D]
/[\w\W]
/[\s\S]
(演示):s.match(/([\s\S]*)<FooBar>/)[1]
- c++ (
std::regex
)使用[\s\S]
或JS解决办法(演示):regex rex(R"(([\s\S]*)<FooBar>)");
- vba -使用同样的方法作为在JavaScript,
([\s\S]*)<Foobar>
. - 红宝石 -使用
/m
多行 修改 (演示):s[/(.*)<Foobar>/m, 1]
- 去 -使用内联修改
(?s)
在开始(演示):re: = regexp.MustCompile(`(?s)(.*)<FooBar>`)
- swift -使用
dotMatchesLineSeparators
或者(更)通过(?s)
内联修改的图案:let rx = "(?s)(.*)<Foobar>"
- 目标-c -同样迅速的,
(?s)
作的最简单,但在这里是怎样的 选项,可以使用:NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:®exError];
- re2, 谷歌的应用程序-脚本 -使用
(?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]
是分析为支架式匹配一个单一的字符, \
或 s
或 S
.
在JavaScript中,使用 / [\ S \ s] *&lt; Foobar&gt; /
。 来源
<代码>([\ S \ S] *)&LT; FooBar的&GT; 代码>
该点匹配除换行符之外的所有内容(\ r \ n)。所以使用\ s \ S,它将匹配所有字符。
我们也可以使用
(.*?\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<Foobar></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")
并且替换工作正常。