匹配两个特殊字符之间的所有内容的正则表达式

3

我想找到两个特殊字符之间的所有字符。问题是含有新行符的字符没有被包括在内,所以我一直无法找到解决方案。尽管这可能很简单,但我似乎无法找到正确的正则表达式。

你能告诉我如何解决这个问题吗?

源数据结构如下:

\#(.*)\; 

不包括换行符和

(?!\#)([\S\s])(?!=\;) 

还是不起作用。

它选择了所有内容,但没有进行分组操作...

源代码看起来像这样:

#first line of text;
#second line of text;
#third line could easy 
be on a new line;
#forth etc;
#this could (#hi,#hi,#hi) also 
happen though:));
#so.... any idea;

每一行都以#开头,以;结尾。


你的答案在这里 - Wiktor Stribiżew
3个回答

1
我看到你的正则表达式有两个问题:
  • 由于缺少量词,你的[\S\s]只能匹配一个字符。
  • 其次,你需要一个非贪婪的正则表达式,这样它就不会匹配所有行。

另外,在你写(?!#)时,我猜你想写其中的任何一个字符,因此你应该将它放在字符集中,如[?!#]

你需要使用以下正则表达式,从第一组中捕获你的文本

#([\w\W]*?);

正则表达式演示

就像你尝试的那样,如果你想让完整匹配仅选择预期的文本,你可以使用lookaround。

带有lookaround的正则表达式演示,因此您的完整匹配只是预期的文本

此外,写[^;]*(也匹配换行符)比.*?快得多,因此最好使用这个正则表达式,

(?<=[?!#])[^;]*(?=;)

具有最佳性能的正则表达式演示


1

你只需要稍微修改一下第一个正则表达式,让它看起来像这样:

#([\s\S]*?);
  • . 只匹配非换行字符。所以我用 [\s\S] 替换它 - 空格集合和非空格集合的并集 - 所有字符的集合。如果你的正则表达式引擎有 "单行" 选项,你可以打开它,. 将匹配换行符。

  • 我也使 * 懒惰。否则,它将只是一个完整的匹配,一直匹配到最后一个 ;。更多信息,请参见 question

  • 你不需要转义 ;


0

您必须使用单行标志/s或将空格字符\s作为第二个替代方案添加到所有字符.。此外,您的*量词必须是懒惰/非贪婪的,因此整个正则表达式在找到第一个;时停止。

#((?:.|\s)*?); or #(.*?);/s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接