如何在正则表达式中指定负字符类中的倍数?

时间:2018-02-19 10:48:50

标签: regex

我正在尝试编写正则表达式来搜索除数字或*-字符之外的任何内容,但需要注意一点。我碰到墙的地方是我需要能够找到三个或更少的数字而不是四个或更多,尽管即使一个*-也不应该被发现。

这是我到目前为止(三场比赛):

.*?([^0-9\*-]+).*?([^0-9\*-]+).*?([^0-9\*-]+).*?

我不知道在哪里插入{4,}数字(我已经尝试过,它似乎无法在任何地方工作)或者如何根据需要更改它。

例如,在"Jack has* 777 1883874 -sheep-"中,我希望它返回"Jack has 777 sheep"。或者在"2343klj-3***.net"我希望它返回"klj 3 .net"

2 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式(替换为文字空格," "):

(?:[-*\s]|\d{4,})+

请参阅regex demo。替换为$1(以插入一个捕获的水平空格,如果有的话)。

<强>详情

  • (?:[-*\s]|\d{4,})+ - 匹配一个或多个连续重复的non-capturing group
    • [-*\s] - 0+个空格,-或/和*
    • | - 或
    • \d{4,} - 4位数。

接下来,要删除所有前导和尾随空格,您可以使用

^\s+|\s+$

并替换为空字符串。 ^\s+匹配字符串开头的1+个空格,\s+$匹配字符串末尾的1 +个空格。

答案 1 :(得分:0)

在这里的帮助下,这是有效的。在一个正则表达式中完成所有操作可能是不可能的,因为在开始和结束时不需要空格,而是在每个剩余的分组之间存在空格。

首先,使用([-*\h]|\d{4,})+进行查找和替换,并用空格替换。

其次,使用^\s*(.*)\s*$