如何使正则表达式在负向前瞻后仅允许一个字符

时间:2019-11-24 03:40:00

标签: regex

我希望正则表达式解析为四位数字,在这些数字被视为有效之后,只能用一个逗号或什么都没有。

有效示例:

  • 1970
  • 1970年你好
  • 1970,你好
  • 你好,1970

无效的示例:

  • 1970hello
  • 1970,你好
  • 1970,
  • 你好,1970

我只希望实际解析数字(例如1970)。

我目前有:(?<![^\s,])(\d{4})(?![^\s,]),但与底部三个无效字符串匹配。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果在4位数字后只需要一个逗号或什么都不想要,则可以使用正号(?=,?(?!\S))断言右边的内容是可选的逗号。然后使用负数前瞻来断言逗号不是非空白字符之后出现的情况。

如果4位数字前的字符只能是逗号,而不是逗号前的非空格字符,则可以在(?<!\S\S)后使用负向后缀来排除2个连续的非空格字符

但是您还希望排除(?<![^,\s])之前的逗号而不是逗号,例如不允许$1970

(?<!\S\S)(?<![^,\s])\d{4}(?=,?(?!\S))
  • (?<!后面是负数,则断言左侧没有
    • \S\S匹配2个连续的非空白字符
  • )近距离浏览
  • (?<!后面是负数,则断言左侧没有
    • [^,\s]匹配除,或空格char
    • 以外的任何字符
  • )近距离浏览
  • \d{4}匹配4位数字
  • (?=正向前进,断言右边是
    • ,?(?!\S)与可选的,匹配,后跟非空格字符
  • )提前关闭

Regex demo

请注意,如果只需要匹配项,则可以省略捕获组。

答案 1 :(得分:0)

您对条件的表述似乎与您的示例不一致。您的示例中可能的一种可能的概括是要求数字以空格分隔,但允许在数字之前或之后使用单个相邻的逗号,但是,我们当然不能真正知道那是什么你的意思是真的。

(?:(?:^|\s),?)(\d{4})(?=,?(?:\s|$))

捕获括号中包含数字;之前将没有一场比赛。

答案 2 :(得分:-1)

因为您的逗号。您需要(?<!\S\S)(\d{4})(?!\S\S)才能匹配无效的