我希望正则表达式解析为四位数字,在这些数字被视为有效之后,只能用一个逗号或什么都没有。
有效示例:
无效的示例:
我只希望实际解析数字(例如1970)。
我目前有:(?<![^\s,])(\d{4})(?![^\s,])
,但与底部三个无效字符串匹配。有什么想法吗?
答案 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)
与可选的,
匹配,后跟非空格字符)
提前关闭请注意,如果只需要匹配项,则可以省略捕获组。
答案 1 :(得分:0)
您对条件的表述似乎与您的示例不一致。您的示例中可能的一种可能的概括是要求数字以空格分隔,但允许在数字之前或之后使用单个相邻的逗号,但是,我们当然不能真正知道那是什么你的意思是真的。
(?:(?:^|\s),?)(\d{4})(?=,?(?:\s|$))
捕获括号中包含数字;之前将没有一场比赛。
答案 2 :(得分:-1)
因为您的逗号。您需要(?<!\S\S)(\d{4})(?!\S\S)
才能匹配无效的