正则表达式:获取字符串的匹配和“不匹配”部分

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(),正如我在我现在已删除的评论中所写的那样;那是一个错字)。

以上是关于正则表达式:获取字符串的匹配和“不匹配”部分的主要内容,如果未能解决你的问题,请参考以下文章

pcre和正则表达式的误点

正则表达式:最小可能匹配或非贪婪匹配

正则表达式 如何完成匹配某个字符串 但是不包含指定字符串

正则表达式

正则表达式匹配超过 2 个空格但不匹配新行

正则表达式不匹配正确的字符串