正则表达式匹配字母数字,除了特定的子字符串
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).CastRegex.Matches(text, @"((?:(?!sq)[A-Za-z0-9\s])+)|sq").Cast<Match>().Aggregate("", (s, e) => s + e.Groups[1].Value, s => s)
这样的糟糕解决方法。
您无法使用e.Value
,抱歉。以上是关于正则表达式匹配字母数字,除了特定的子字符串的主要内容,如果未能解决你的问题,请参考以下文章