我正在构建一个正则表达式,它将接受至少1个字母数字字符和任意数量的空格。
现在我已经...... [A-Za-z0-9]+[ \t\r\n]*
我知道至少有1个字母数字或至少1个空格。我该如何解决这个问题?
编辑:要回答下面的评论,我希望它接受包含ATLEAST 1字母数字和任意数量(包括否)空格的字符串。现在它将接受一个空格。
EDIT2:澄清一下,我不希望接受任意数量的空格(包括0),除非至少有1个字母数字字符
答案 0 :(得分:2)
\s*\p{Alnum}[\p{Alnum}\s]*
你的正则表达式[A-Za-z0-9]+[ \t\r\n]*
要求字符串以字母或数字开头(或者更确切地说,它在看到之前不会开始匹配)。添加\s*
允许匹配以空格开头,但在跟随字母数字的第一个空白字符后,您仍然无法匹配任何字母数字(例如,它与{不匹配}在xyz
中{1}}。将结尾abc xyz
更改为\s*
可以解决问题。
另外,[\p{Alnum}\s]*
与Java中的\p{Alnum}
完全相同,而在所有正则表达式中并非如此。我使用[A-Za-z0-9]
,不仅因为它更短,而且因为它提供了更多的保护,如\p{Alnum}
这样的拼写错误(这在句法上是有效的,但几乎肯定不是作者真正的意思)。
编辑:也应该考虑性能。我最初在[A-z]
之后添加了+
,但我意识到这不是一个好主意。如果这是较长的正则表达式的一部分,并且正则表达式立即不匹配,则最终可能会浪费大量时间尝试将相同的字符组与\p{Alnum}
或\p{Alnum}+
匹配。但是,领先[\p{Alnum}\s]*
是可以的,因为\s*
与\s
匹配的任何字符都不匹配。
答案 1 :(得分:1)
任何一个或多个单词char为零或更多空格
\w+\s*
答案 2 :(得分:0)
嘿试试这个([^\s]+\s*)
[^ \ s]意味着抓住所有不是空白的空间,而\ s *意味着空白是可选的(如果你真的想要至少一个空格+而不是)
编辑:sory mine catch不仅使用字母数字(put([a-zA-Z0-9] + \ s )用于字母数字)
答案 3 :(得分:0)
这应该可以解决问题:
\s*\p{Alnum}+\s*
\p{Alnum}
是一个字母数字字符:[\p{Alpha}\p{Digit}]
*
说“零次或多次”+
说“至少有一个”(不是“或”,因为您似乎相信,或写成|
)|
表示“或”\s
是一个空格字符:[ \t\n\x0B\f\r]
编辑:要回答下面的评论,我希望它接受包含至少1个字母数字和任意数量(包括没有)空格的字符串。
我建议的模式至少需要一个字母数字字符。
EDIT2:澄清一下,我不希望接受任意数量的空格(包括0),除非至少有1个字母数字字符
我建议的模式不会只接受空白字符。