我想找到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;
任何新行均以#
开头,每行以;
结束
答案 0 :(得分:2)
我在您的正则表达式中看到了两个问题,
[\S\s]
中缺少量词,因为它只能匹配一个字符。此外,您在此编写(?!#)
的位置是我想写的任何一个字符,为此,您应该将其放在这样的字符集中[?!#]
您需要此正则表达式,您可以在其中捕获来自group1的文本
#([\w\W]*?);
就像您尝试的那样,如果您希望完全匹配仅选择想要的文本,则可以使用环顾四周。
Regex Demo with lookarounds so your full match is intended text only
此外,编写[^;]*
(也匹配换行符)比.*?
快得多,因此,您最好使用此正则表达式,
(?<=[?!#])[^;]*(?=;)
答案 1 :(得分:1)
您只需要稍微修改一下您的第一个正则表达式即可,如下所示:
#([\s\S]*?);
.
仅匹配非换行符。因此,我将其替换为[\s\S]
-空格集和非空格集-所有字符集。如果您的正则表达式引擎具有“单行”选项,则可以将其打开,.
也将匹配新行。
我也使*
变得很懒。否则,它将是一个完整的匹配,一直匹配到最后一个;
。有关更多信息,请参见此question。
您不需要逃脱;
。
答案 2 :(得分:0)
您必须使用单个行标志/s
或添加空白字符\s
作为所有字符.
的第二种替代方法。另外,您的*
量词必须是惰性的/非贪婪的,因此整个正则表达式会在它发现的第一个;
处停止。
#((?:.|\s)*?); or #(.*?);/s