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

时间:2019-05-02 05:57:04

标签: regex

我想找到2个特殊字符之间的所有字符。我找不到解决方案,因为其中不包含新行。这很容易,但是我似乎找不到合适的正则表达式。

我该如何解决这个问题?

源数据的结构如下:

\#(.*)\; 

不包括新行和

(?!\#)([\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;

任何新行均以#开头,每行以;结束

3 个答案:

答案 0 :(得分:2)

我在您的正则表达式中看到了两个问题,

  • [\S\s]中缺少量词,因为它只能匹配一个字符。
  • 第二,您需要一个非贪婪的正则表达式,以使其与所有行均不匹配。

此外,您在此编写(?!#)的位置是我想写的任何一个字符,为此,您应该将其放在这样的字符集中[?!#]

您需要此正则表达式,您可以在其中捕获来自group1的文本

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

Regex Demo

就像您尝试的那样,如果您希望完全匹配仅选择想要的文本,则可以使用环顾四周。

Regex Demo with lookarounds so your full match is intended text only

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

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

Regex Demo with best performance

答案 1 :(得分:1)

您只需要稍微修改一下您的第一个正则表达式即可,如下所示:

#([\s\S]*?);
  • .仅匹配非换行符。因此,我将其替换为[\s\S]-空格集和非空格集-所有字符集。如果您的正则表达式引擎具有“单行”选项,则可以将其打开,.也将匹配新行。

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

  • 您不需要逃脱;

答案 2 :(得分:0)

您必须使用单个行标志/s或添加空白字符\s作为所有字符.的第二种替代方法。另外,您的*量词必须是惰性的/非贪婪的,因此整个正则表达式会在它发现的第一个;处停止。

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