【问题标题】:Regex for First word and last word of a string separates with字符串的第一个单词和最后一个单词的正则表达式用
【发布时间】:2016-01-20 13:53:46
【问题描述】:

我正在尝试获取以下表达式的正则表达式,但无法实现:

  • 字符串有 4 个单词,用点 (.) 分隔。
  • 第一个单词匹配给定的单词(例如 HELLO)。
  • 第二个和第三个单词可以包含任何字符,但点本身 (.) 除外。
  • 最后一个单词再次匹配给定的单词(例如 csv)。

所以:

  • HELLO.something.Somethi#gElse.csv 应该匹配。
  • something.HELLO.?.csv 不应该匹配。
  • HELLO.something...csv 不应该匹配。
  • HELLO.something.somethingelse.notcsv 不应匹配

我可以使用 split(.) 来完成,然后检查单个单词,但我正在尝试让它与 Regex 和 Pattern 类一起使用。

任何帮助将不胜感激。

【问题讨论】:

  • 欢迎来到 Stack Overflow!请包含一些代码以显示您尝试过的内容。

标签: java regex


【解决方案1】:

这比较简单,只要你了解字符类。带有方括号[xyz] 的正则表达式匹配列表{x, y, z} 中的任何字符;正则表达式 [^xyz] 匹配任何字符除了 {x, y, z}

现在你可以构造你的表达式了:

^HELLO\.[^.]+\.[^.]+\.csv$

+ 表示“一个或多个前面的表达式”; \. 表示“点本身”。 ^ 表示“字符串的开头”; $ 表示“字符串的结尾”。这些锚点阻止正则表达式匹配

blahblahHELLO.world.world.csvblahblah

Demo.

编写这样的正则表达式的一个共同目标是捕获一些内容,例如,第一个和第二个点之间的字符串,以及第二个和第三个点之间的字符串。使用捕获组将这些字符串的内容带入您的 Java 程序:

^HELLO\.([^.]+)\.([^.]+)\.csv$

每对括号定义一个捕获组,从1 开始索引(索引为零的组表示整个表达式的捕获)。从模式中获取匹配对象后,您可以查询它的组,并提取相应的字符串。

请注意,Java 正则表达式中的反斜杠需要加倍。

【讨论】:

  • 如果HELLO...csv 是有效匹配项,则从+ - 一个或多个 切换到* - 零个或多个
  • 不错的答案。您可能想演示一个正则表达式,其中第一个单词可以是 HELLO 或 WORLD 或 FOO,最后一个单词可以是 csv 或 xls 或 txt
  • 还可以提到使用组来收集匹配中的每个单词。
  • 非常感谢,真的帮助我更好地理解 Regex :)
  • 还可以考虑将需要匹配的单词(HELLOcsv)包装在Pattern.quote 方法中。 (如果你从某个变量中获取它们)
【解决方案2】:

【讨论】:

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