正则表达式匹配字母数字,除了特定的子字符串

Posted

技术标签:

【中文标题】正则表达式匹配字母数字,除了特定的子字符串【英文标题】:Regex to match alphanumeric except specific substring 【发布时间】:2021-08-04 12:28:57 【问题描述】:

编辑: 强制性条件: 正则表达式必须插入以下语句:

Regex regex = new Regex("<REGEX_STRING>");
val= regex.Matches(val).Cast<Match>().Aggregate("", (s, e) => s + e.Value, s => s);

我发现我不能使用Regex.Replace() 方法,正如下面的答案中所建议的那样。

我正在寻找一个必须满足两个条件的 RegEx:

    只接受 a-z、A-Z、0-9、\s(一个或多个),忽略 _(这就是为什么 \w 不是一个选项)

    [!] 排除字符串内任意位置的任何sq“子字符串”

*sq - 实际上是这个 4 字符的字符串,不是 ASCII 符号的任何快捷方式!


到目前为止我所拥有的是:

\b(?!sq)[a-zA-Z0-9 ]*

但是当_ 出现时,这个正则表达式会删除所有内容+ 它也排除了整个[sq]。 例如,对于给定的字符串:

test[sq]uirrelsq_things 我应该得到testsquirrelthings 而我得到的是:testuirrel


input | expected output下表:

Input string Expected output
Na#me Name
M2a_ny M2any
Varisqo@us Various
test [sq]uirrel h23ere! test squirrel h23ere

非常感谢任何帮助,这是我遇到过的最复杂的 RegEx ????

【问题讨论】:

一对可以在另一个里面吗? 也许删除它们? Regex.Replace(text, @"sq|[^a-zA-Z\s]", "")? 你的要求是矛盾的:你说“accept only az, AZ, 0-9, \s (one or more)”然后举个例子M2a_ny - > Many 2 被删除。 @Backs 是的,inputString 可能会以 testsq 之类的形式出现,但它也应该被完全拒绝。所以结果将是 -> 测试。我不知道这是否回答了你的问题 @JohnathanBarclay 我的错!将立即修复它。它应该是 M2any。与 h23ere 相同 【参考方案1】:

问题在于,在 .NET 正则表达式中,除了 多字符序列之外,无法匹配任何文本。

你将不得不使用一个糟糕的解决方法,比如

((?:(?!sq)[A-Za-z0-9\s])+)|sq

您将需要获取第 1 组的值。请参阅.NET regex demo。这是C# demo:

var texts = new List<string>  "Na#me","M2a_ny","Varisqo@us","test [sq]uirrel h23ere!" ;
var pattern = @"((?:(?!sq)[A-Za-z0-9\s])+)|sq";
    foreach (var text in texts) 
    var result = Regex.Matches(text, pattern).Cast<Match>()
            .Aggregate("", (s, e) => s + e.Groups[1].Value, s => s);
    Console.WriteLine(result);

// => Name, M2any, Various, test squirrel h23ere

更好的基于Regex.Replace 的解决方案 您可以使用

删除sq 和所有非字母和非空白字符
Regex.Replace(text, @"sq|[^a-zA-Z0-9\s]", "")
Regex.Replace(text, @"sq|[^\pL\pN\s]", "")

\pL / \pN 版本可用于支持任何 Unicode 字母/数字。

见.NET regex demo:

【讨论】:

情况发生了一点变化:这个解决方案有效,但我不能使用它。我将不得不在代码中使用相同的方法: val = regex.Matches(val).Cast().Aggregate("", (s, e) => s + e.Value, s => s) ; @KamilTurowski 好吧,问题是在 .NET 正则表达式中不可能匹配除 多字符序列之外的任何文本。您将不得不使用像Regex.Matches(text, @"((?:(?!sq)[A-Za-z0-9\s])+)|sq").Cast&lt;Match&gt;().Aggregate("", (s, e) =&gt; s + e.Groups[1].Value, s =&gt; s) 这样的糟糕解决方法。 您无法使用e.Value,抱歉。

以上是关于正则表达式匹配字母数字,除了特定的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

正则表达式总结

正则表达式

正则表达式考点

使用正则表达式匹配所有以 4 位数字结尾的子字符串

正则表达式