正则表达式至少有两个选项之一,但顺序

时间:2017-06-21 17:04:32

标签: java regex

我正在尝试编写一个正则表达式(用于Java模式),它将匹配可能包含字母的字符串,该字母可能后跟一个空格,然后是数字,但必须至少有一个。例如,应匹配以下字符串:

  • " a 5"
  • " b 9"
  • " 8"

但是,它不应与空字符串匹配("")。

此外,我想让每个组件成为命名的捕获组。

以下有效,但允许空字符串。

"(?<let>\\p{Alpha})?( (?<num>\\p{Digit}))?"

4 个答案:

答案 0 :(得分:4)

为了确保至少有一个,您可以在开头使用前瞻(?=\\p{Alpha}| \\p{Digit})

"(?=\\p{Alpha}| \\p{Digit})(?<let>\\p{Alpha})?( (?<num>\\p{Digit}))?"

通常,为了避免空字符串,您可以使用(?=.)

答案 1 :(得分:1)

您可以使用否定前瞻来避免空输入并将正则表达式保持为:

^(?!$)(?<let>\p{L})?(?:\h+(?<num>\p{N}))?$

RegEx Demo

(?!$)是空的字符串匹配失败的负面预测。

答案 2 :(得分:0)

您可以通过以下方式解决问题:

([a-z]? \d)|([a-z] \d?)

您可以在演示here中看到涵盖测试用例的代码。您可以在此处的演示中看到此代码。这是非常基本的正则表达式知识,你一定要学习更多关于正则表达式的知识,网上有很多很好的教程(例如这个)。

答案 3 :(得分:0)

你可以使用|为或,然后简单地重复&#34;任何模式&#34;匹配这样的一切。

((?<let>[A-z])|(?<num>\d)\s*)+

这使您可以按任意顺序匹配任意数量的命名模式。