如何在正则表达式中排除非数字字符

3

我有一个字符串,内容如下:

Section 78(1) of the blabla

这些是我的正则表达式

\b\s(?!\b(\d{1,3}|\d{1,2}[a-zA-Z]|\d{5,})\b)\b\S*

期望输出结果是:blabla 这个正则表达式是有效的,但是由于 () 的存在,它没有排除“of”。有人能帮忙吗?谢谢。

1
预期输出是什么? - Michał Turczyn
预期输出是“ of the blabla”。 - lara
也许您可以删除前导单词边界? - The fourth bird
如果期望的输出是一个 ["of", "the", "blabla"] 数组,那么在第一次使用模式时不应该在模式的开头使用单词边界,参见 \s(?!\b(\d{1,3}|\d{1,2}[a-zA-Z]|\d{5,})\b)\S* 演示。这符合您的需求吗?请解释规则并说明是否真的需要一个数组作为结果。 - Wiktor Stribiżew
@lara发布了一个答案 - Wiktor Stribiżew
显示剩余2条评论
2个回答

0

尝试这个模式:.+\d\)?

解释:

.+ - 匹配一个或多个任意字符

\d - 匹配数字

\)? - 匹配 ) 零次或一次

由于 + 的贪婪性,它会匹配到最后一个数字,如果它在括号中,则匹配后面的括号。

演示

或者使用 \d+(?:\(\d+\))?(.+)

然后所需的输出在第一个捕获组中。

演示


0

看起来你只需要改变的是在\S*前面移除\b,并将\S*替换为.+.*(如果匹配可以是空字符串)。

\s(?!\b(?:\d{1,3}|\d{1,2}[a-zA-Z]|\d{5,})\b)(.+)

查看正则表达式演示,获取第一组值。请注意,我将第一组匹配数字的负向先行断言转换为非捕获组,以避免在结果匹配列表中产生混乱。

VB.NET 演示

Dim r As New Regex("\s(?!\b(?:\d{1,3}|\d{1,2}[a-zA-Z]|\d{5,})\b)(.+)")
Dim s As String
s = "Section 78(1) of the blabla"
For Each m As Match In r.Matches(s)
    Console.WriteLine(m.Groups(1).Value)
Next

结果:blabla的结果


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接