【问题标题】:Regex for matching all words before a specific character用于匹配特定字符之前的所有单词的正则表达式
【发布时间】:2017-01-06 17:19:38
【问题描述】:

我需要提取字符串中特定字符之前的所有单词,在本例中为冒号 (:)。

例如:

String temp = "root/naming-will-look-like-this:1.0.0-SNAP";

从上面的字符串我想返回:

“根”“命名”“将”“看起来”“喜欢”“这个”

我不擅长正则表达式,到目前为止我已经想出了这个。

\w+(?=:)

只返回冒号前面的一个单词(“this”)。

如何检索之前的所有单词?

提前致谢。

【问题讨论】:

  • 请告诉我们您对“单词”的定义。仅包含 A 到 Z、不区分大小写的任何内容?
  • 是的,任何 a-z,不区分大小写。我希望它们被提取为“单词而不是单个字符”。即“root”而不是“r”、“o”、“o”、“t”。
  • 由于单个匹配操作无法为您提供多个结果,因此您必须更具体地了解您打算如何收集结果。即,您可以使用split 创建一个数组(然后您需要分隔符模式)或在Matcher 上重复调用find()(然后您需要单词模式)......如果你想要一个数组,你可以做到在单个操作中,例如 String[] array = temp.split("\\W*:.*|\\W+");

标签: java regex


【解决方案1】:

您可以像这样使用前瞻:

\w+(?=.*:)

RegEx Demo

\w+ 将匹配所有单词,并且前瞻 (?=.*:) 断言我们前面有一个 :

【讨论】:

  • 这很完美!非常感谢你。当它允许我时,我会接受这个作为答案
  • 请注意,如果有多个冒号,这将查找直到最后一个冒号的单词。
【解决方案2】:

试试这个:

    String s = "root/naming-will-look-like-this:1.0.0-SNAP";
    s = s.replaceAll(":.*", "");
    String[] arr = s.split("\\W+");

【讨论】:

    【解决方案3】:

    使用\G 锚点以及Java 的字符类交集,您可以将单词存储到第一个捕获组中:

    \G(\w+)[\W&&[^:]]*
    

    这不会绕过输入字符串下面的多个冒号:

    root/naming-will-look-like-this:1.0.0-SNAP:some-thing-else
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      相关资源
      最近更新 更多