如何使用正则表达式匹配四个数字字段或文本字符串

Posted

技术标签:

【中文标题】如何使用正则表达式匹配四个数字字段或文本字符串【英文标题】:How can I match four number fields or a text string using regex 【发布时间】:2021-08-08 10:37:33 【问题描述】:

因此,我正在连接的传感器输出 4 个多位整数(由空格分隔)或错误字符串。

理想情况下,我的正则表达式将返回上述任一情况的匹配项并拒绝任何 其他输出 - 例如如果只输出 3 个数字。然后我可以检查以下c#中是否有4组(数字输出)或1组(错误字符串输出)。

我的正则表达式一直匹配,当数字少于 4 个时返回空格,所以我仍然需要检查所有内容。

我尝试输入?:,但格式中断。任何正则表达式都能应对挑战?提前致谢。

([0-9]+\s)([0-9]+\s)([0-9]+\s)([0-9]+)|([a-zA-Z\s_!]+) 

因此,数字示例将是 11 222 33 4444Sensor is in an error state! 不正确的输出将是 222 11 3333,因为它只有 3 个字段

另外 - 我需要捕获四个数字(但不是空格)或错误字符串。

【问题讨论】:

您尝试匹配的实际示例可能最有帮助。 如果你用锚包裹它呢? ^(?:[0-9]+\s[0-9]+\s[0-9]+\s[0-9]+|[a-zA-Z\s_!]+)\z?还是^(?:[0-9]+(?:\s[0-9]+)3|[a-zA-Z\s_!]+)\z 最后一个括号内的 \s 对我来说似乎不正确:[a-zA-Z\s_!] 其实error 模式并不清楚。请澄清。 因此,数字示例将是“11 222 33 4444”或“传感器处于错误状态!”不正确的输出将是 222 11 3333,因为它只有 3 个字段 【参考方案1】:

您可以捕获只有数字的 4 个组,并匹配组外的空白字符。

否则匹配字符类中任何列出的字符的 1 次以上。请注意,\s 也可以匹配换行符,并且由于 \s 在字符类中,匹配也可以仅包含空格。

要匹配整个字符串,您可以添加锚点。

^(?:([0-9]+)\s([0-9]+)\s([0-9]+)\s([0-9]+)|[a-zA-Z\s_!]+)$

» Regex demo

匹配错误字符串的另一个选项是开始匹配不带数字的单词字符,可选地由空格字符重复,然后再次匹配不带数字的单词字符。

^(?:([0-9]+)\s([0-9]+)\s([0-9]+)\s([0-9]+)|[^\W\d]+(?:\s+[^\W\d]+)*!?)$

» Regex demo

如果错误消息中可能有数字,但您不想只匹配数字或空白字符,则可以使用否定前瞻来排除它。

 ^(?:([0-9]+)\s([0-9]+)\s([0-9]+)\s([0-9]+)|(?![\d\s]*$).+)$

» Regex demo

【讨论】:

@jelly23 - 很高兴它对你有用。请考虑通过单击左侧的 ✓ 来接受答案(请参阅How to accept SO answers)。请注意,您会得到 2 reputation points 接受解决方案。

以上是关于如何使用正则表达式匹配四个数字字段或文本字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式过滤文本

正则表达式如何匹配空值?

正则表达式如何匹配空值?

正则表达式

正则表达式如何匹配多行的所有任意字符

如何用正则表达式匹配括号中的内容,不包含括号