正则表达式匹配所有不以数字开头的单词

时间:2014-10-14 00:17:02

标签: java regex java.util.scanner

对于noobish问题感到抱歉,但我对正则表达式不太感兴趣。我有几个这样的感官:

text1.2text: text3,,text4 5. text6=== t7@ text8. T, 9-- T10我希望使用scanner返回:

a)单个字符, b)包含字符和数字的字词,但以字母开头。

其他任何东西都可以看作是分隔符。

所以在上述情况中,这些应该归还:

text1
text3
text4
text6
t7
text8
T
T10

我可以在扫描仪中使用多个分隔符,例如"\\.|\\:|\\,|\\,,"等,但它可以是我要提取的单词之间的任何内容加上我不知道这是一个非常好的方法。

我是否可以使用正则表达式作为分隔符,或者可以在scanner.hasNext("regex")中提取这些单词?

提前致谢

3 个答案:

答案 0 :(得分:7)

使用word boundary

\b[a-z][a-z0-9]*

Demo


由于单词边界会查找单词字符(\w[a-zA-Z0-9_])与非单词字符(\W[^a-zA-Z0-9_])相邻的位置,这意味着示例字符串_foo不匹配(在_f之间不是单词边界)。如果您需要这样,请使用lookbehind:

添加辅助零长度断言
(?:\b|(?<=_))[a-z][a-z0-9]*

Demo

答案 1 :(得分:1)

我不确定这是不是你的意思,但似乎你想用这些部分作为分隔符:

text1.2text:  text3,,text4 5. text6=== t7@ text8. T, 9-- T10
     ^^^^^^^^^     ^^     ^^^^     ^^^^  ^^     ^^ ^^^^^^

表示您希望将此字符串拆分为每个非字母数字字符(以及后面以数字开头的可选字)。如果是这种情况,您可以将扫描仪设置为使用分隔符,如

"([^\\w]+(\\d\\w*)*)+"
  • [^\\w]+一个或多个非字母数字字符
  • (\\d\\w*)*后跟零个或多个以数字
  • 开头的单词
  • ([^\\w]+(\\d\\w*)*)+分隔符可以重复多次(这样我们就可以避免在分隔符之间返回空字符串)

并简单地遍历next元素。


样本:

String text = "text1.2text:  text3,,text4 5. text6=== t7@ text8. T, 9-- T10";
Scanner sc = new Scanner(text);
sc.useDelimiter("([^\\w]+(\\d\\w*)*)+");
while(sc.hasNext())
    System.out.println(sc.next());

输出:

text1
text3
text4
text6
t7
text8
T
T10

答案 2 :(得分:0)

如果您需要匹配整个字符串,请尝试以下方法:

/^(\b[a-z][a-z0-9]*)$/ig

试验:

tag1     // match
tag tag2 // no match
1tag     // no match
@tag     // no match
tag@     // no match
UPPERtag // match

Demo