繁体   English   中英

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

[英]Regex to match all words not starting with digit

很抱歉提出这个笨拙的问题,但是我对regex不太热衷。 我有几个这样的观点:

text1.2text: text3,,text4 5. text6=== t7@ text8. T, 9-- T10 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")中提取这些单词?

提前致谢

使用单词边界

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

演示版


由于单词边界会寻找一个单词字符( \\w[a-zA-Z0-9_] )紧靠非单词字符( \\W[^a-zA-Z0-9_] )的位置,这意味着示例字符串_foo将不匹配(在_f之间不是单词边界)。 如果需要这种情况,请使用后向添加第二个零长度断言:

(?:\b|(?<=_))[a-z][a-z0-9]*

演示版

我不确定这是否是您的意思,但似乎您想将以下部分用作分隔符:

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

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

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

测试:

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

演示版

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM