【问题标题】:Regex to match all words not starting with digit正则表达式匹配所有不以数字开头的单词
【发布时间】:2014-10-14 00:17:01
【问题描述】:

很抱歉提出了一些愚蠢的问题,但我对正则表达式不太感兴趣。我有几个这样的句子:

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") 中提取这些单词?

提前致谢

【问题讨论】:

  • 类似(?i)\b[a-z]\w*

标签: java regex java.util.scanner


【解决方案1】:

使用word boundary:

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

Demo


由于单词边界查找单词字符(\w 或 [a-zA-Z0-9_])与非单词字符(\W 或 [^a-zA-Z0-9_])相邻的位置,这意味着示例字符串 _foo不匹配(在_ 和f 之间不是单词边界)。如果您需要这种情况,请使用后向添加辅助零长度断言:

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

Demo

【讨论】:

    【解决方案2】:

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

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

    这意味着您要在每个非字母数字字符(以及后面以数字开头的可选单词)上拆分此字符串。如果是这种情况,您可以将扫描仪设置为使用分隔符,例如

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

    然后简单地迭代 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
    

    【讨论】:

    • 准确地说。谢谢你。只有一个问题。最后一个+ 用于覆盖单词之间的两个空格。正确的?如果是这样,我不能也使用([^\\w]+(\\d\\w*)*)[^\\w]+ 吗?
    • @GeeKat88 + 用于分隔符,如..2foo::3bar。如您所见,此字符串包含两个连续的分隔符:..2foo 和 ::3bar。如果我不使用 + next 将在这些分隔符之间返回空字符串。如果我们使用([^\\w]+(\\d\\w*)*)[^\\w]+ 并且分隔符看起来像::1aa::2bb 而不是2bb 将不会包含在此分隔符中,因此它将作为有效单词返回,而根据您的问题判断它不应该。
    【解决方案3】:

    如果你需要匹配整个字符串,试试这个:

    /^(\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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多