我正在尝试编写一个正则表达式(用于Java模式),它将匹配可能包含字母的字符串,该字母可能后跟一个空格,然后是数字,但必须至少有一个。例如,应匹配以下字符串:
但是,它不应与空字符串匹配("")。
此外,我想让每个组件成为命名的捕获组。
以下有效,但允许空字符串。
"(?<let>\\p{Alpha})?( (?<num>\\p{Digit}))?"
答案 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}))?$
(?!$)
是空的字符串匹配失败的负面预测。
答案 2 :(得分:0)
您可以通过以下方式解决问题:
([a-z]? \d)|([a-z] \d?)
您可以在演示here中看到涵盖测试用例的代码。您可以在此处的演示中看到此代码。这是非常基本的正则表达式知识,你一定要学习更多关于正则表达式的知识,网上有很多很好的教程(例如这个)。
答案 3 :(得分:0)
你可以使用|为或,然后简单地重复&#34;任何模式&#34;匹配这样的一切。
((?<let>[A-z])|(?<num>\d)\s*)+
这使您可以按任意顺序匹配任意数量的命名模式。