【问题标题】: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:

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

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

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


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

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

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

test[sq]uirrel{sq}_things 我应该得到testsquirrelthings 而我得到的是:testuirrel


input | expected output下表:

Input string Expected output
Na#me Name
M2a_ny M2any
Vari{sq}o@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 可能会以 test{{sq}} 之类的形式出现,但它也应该被完全拒绝。所以结果将是 -> 测试。我不知道这是否回答了你的问题
  • @JohnathanBarclay 我的错!将立即修复它。它应该是 M2any。与 h23ere 相同

标签: c# regex


【解决方案1】:

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

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

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

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

var texts = new List<string> { "Na#me","M2a_ny","Vari{sq}o@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}|[^\p{L}\p{N}\s]", "")

\p{L} / \p{N} 版本可用于支持任何 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,抱歉。
猜你喜欢
  • 2016-09-01
  • 2011-11-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多