正则表达式以匹配任意组合的单词,但不包括单个十进制数字。

3

我有一个包含(?:\S+ ){0,4}正则表达式。

它应该匹配:(它已经正确地执行这个任务)

2 Terry White 
Tramal 100 
Asmol 2.5 
2.5% 

除了单个小数或价格之外,它可以匹配任何类似的内容。

不应该匹配以下内容:(我不知道如何排除此异常情况)

870
6.75
$17.60

这真的可能吗?

感谢大家提供的意见。对于那些好奇的人,这是一个使用的最短的“长正则表达式”之一(您可以在末尾找到它)。

^ {0,5}(\d{4}[A-Z]) +((?:\S+ )+(?: {0,10}K\+)?) *(\.\.|\d+) +(?:[A-Z#\*] *)?(\.\.|\d+(?:\.\d{1,4})?) +(?:[ab] *)?((?:\S+ ){0,4}) *([A-Z]{2}) {0,10}$

你有没有灵活性来反向编写代码?换句话说,编写你的正则表达式以匹配单个小数或价格(非常简单)。如果匹配,则拒绝输入;否则接受它。 - Brian Rogers
不,就像我说的那样,它只是一个长正则表达式的一部分。无论如何,谢谢。 - Aximili
值得一试。有时候,通过以不同的方式思考问题,你可以解决一个棘手的问题。 - Brian Rogers
2
我不确定你想要用正则表达式单独完成的目标能够实现(基于更新后的信息)。问题在于(这也适用于我的下面的回答),你使用的 (?:\S+ ){0,4} 会捕获 Asmol 2.5,然后我的建议使用回顾后发现了 2.5 并报错。我认为你试图仅通过正则表达式实现过多的功能。你可能需要包含更多的环视来实现这一点,但它会变得非常复杂,而且你当前的正则表达式已经很复杂了。 - Kenneth K.
1个回答

1

我不确定你所说的“单个小数”是什么意思,因为你的第一个失败示例似乎是整数,但你可以尝试以下方法:

^(?!\$?\d+(?:\.\d+)?$).+$

根据您的评论,我认为负回顾后断言可能更符合您的需求:
(?<!\$?\d+(?:\.\d+)?)

2
在编程中,负向先行断言非常有用。此外,根据情况,您可以使用提问者原始表达式来替换末尾附近的.+ - Wiseguy
@Wiseguy 或许是这样,但“或任何其他内容”这个评论让我相信 .+ 更适用。 - Kenneth K.
@aximili 有没有一种可以帮助限定正向预查的标记?你能捕获在插入位置之前的"长正则表达式"的一部分吗?然后可以使用反向引用来限定。 - Kenneth K.
我编辑了这个问题 :) 但是这只是其中一个,我需要能够在其他地方重复使用这个正则表达式。我只知道一点关于负向先行断言,你觉得你能用它吗? - Aximili
接受这个答案。也许实现我想要的是不可能的,但使用负向先行断言/后行断言似乎是最接近的解决方案。 - Aximili
显示剩余2条评论

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