正则表达式:获取字符串的匹配和“不匹配”部分
Posted
技术标签:
【中文标题】正则表达式:获取字符串的匹配和“不匹配”部分【英文标题】:Regex: Get matching and "not matching" parts of string 【发布时间】:2021-02-09 15:04:10 【问题描述】:我有一个这样的字符串:
%1n--%2n##%12n
我需要所有匹配 %1n、%2n、%12n 的匹配项,并且我还需要所有不匹配的部分。例如: -- 和 ##
我的正则表达式模式是(%\d*n)(?!(%\d*n)*)
。
我得到了匹配的部分 (%1n, ...) 以及所有非匹配部分的空匹配。但我的示例的结果应该是:
-
匹配:%1n
匹配:--
匹配:%2n
匹配:##
匹配:%12n
谁能告诉我正确的正则表达式模式以获得我的预期结果?
【问题讨论】:
编程语言是什么?也许你只需要Regex.Split(text,@"(%\w+)")
(C#)或s.split(/(%\w+)/)
(JS)
也许%\d+n|.+?(?=%\d+n|$)
?
或者:%\d+n|(?:(?!%\d+n).)+
编程语言是vb.net(或者c#,不过没关系)
【参考方案1】:
在 C# 中,您可以使用 Regex.Split
和带有捕获括号的正则表达式来返回匹配之间的所有子字符串:
var text = "%1n--%2n##%12n";
var result = Regex.Split(text, @"(%\w+)").Where(x => !String.IsNullOrWhiteSpace(x)).ToList();
foreach (var s in result)
Console.WriteLine(s);
请参阅C# demo。输出:
%1n
--
%2n
##
%12n
(%\w+)
正则表达式匹配并捕获到第 1 组 a %
字符,然后是任何一个或多个单词字符。如果只需要匹配 ASCII 字母/数字,请使用(%[A-Za-z0-9]+)
。
也可以查看VB.NET demo:
Dim pattern As String = "(%\w+)"
Dim s As String = "%1n--%2n##%12n"
Dim matches As String() = System.Text.RegularExpressions.Regex.Split(s, pattern)
For Each m As String In matches
If Not String.IsNullOrEmpty(m) Then
Console.WriteLine(m)
End If
Next
【讨论】:
为什么你认为它应该匹配%
后跟单词字符?根据OP的描述和示例,我认为他们特别想匹配%
,后跟一个数字,然后是n
。否则,一如既往的好答案:)
@41686d6564 这是正则表达式 SO 标签中的经验法则:如果有多个选项,请选择最简单的方法。 \w
是匹配数字和字母时最简单的构造(不精确,因此我建议另一种模式,你的只是另一种模式)。此外,!string.IsNullOrWhiteSpace(x)
可以替换为 !string.IsNullOrEmpty(x)
以在结果中仅保留空格项。
是的,!string.IsNullOrEmpty(x)
或 x.Any()
因为x
在这里永远不会为空(不是!x.Any()
,正如我在我现在已删除的评论中所写的那样;那是一个错字)。以上是关于正则表达式:获取字符串的匹配和“不匹配”部分的主要内容,如果未能解决你的问题,请参考以下文章