合并三个正则表达式组

时间:2017-03-09 08:17:12

标签: java regex

我有三个不同的句子,其中包含重复部分。 我想在一个中合并三个不同的正则表达式组,然后将所有mathes替换为空格。 我在向你寻求帮助,我应该如何对这些团体进行分析?

String locked = "LOCKED (center)"; //LOCKED() - always the same part
String idle = "Idle (second)"; // Idle() - always the same part
String OK = "example-OK"; // -OK - always the same part

我已经构建了三个正则表达式,但它们是分开的。我该怎么称他们?

String forLocked = locked.replaceAll("^LOCKED\\s\\((.*)\\)", "$1");
String forIdle = idle.replaceAll("^Idle\\s\\((.*)\\)", "$1");
String forOK = OK.replaceAll("(.*)\\-OK", "$1");

2 个答案:

答案 0 :(得分:1)

我认为这在技术上有效,但它并不“感觉很好。”

private static final String REGEX =
    "^((Idle|LOCKED) *)?\\(?([a-z]+)\\)?(-OK)?$";

... your code ...

System.out.println(locked.replaceAll(REGEX, "$3"));
System.out.println(idle.replaceAll(REGEX, "$3"));
System.out.println(OK.replaceAll(REGEX, "$3"));

输出是:

center
second
example

打破表达:

  1. ^((Idle|LOCKED) *)? - 可能以空闲或锁定开始,后跟零或多个空格
  2. \\(?([a-z]+)\\)? - 可选的括号中嵌入了一系列小写字符(同样,我们希望匹配该序列)
  3. (-OK)?$ - 可能以文字-OK结尾。
  4. 但仍有一些问题。例如,可选括号不以任何方式捆绑在一起。此外,这会给像Idle (second)-OK - >这样的化合物带来误报。 second

    我最初有一个更严格的正则表达式,但其中一个额外的挑战是在要替换的组上保持一致的匹配索引(此处为$3。)换句话说,有一个整体一组正则表达式,如果你可以使用,在不同的情况下说$k$j,那会更容易。但是,这与开始使用单个正则表达式的整个观点相悖(如果您需要一些预先存在的输入知识,您将要匹配。)更好的是假设我们对内部的内容一无所知标识符lockedidleOK

答案 1 :(得分:0)

您可以将它们与|合并为:

String regex = "^LOCKED\\s\\((.*)\\)|^Idle\\s\\((.*)\\)|(.*)\\-OK$";

String forLocked = locked.replaceAll(regex, "$1");
String forIdle = idle.replaceAll(regex, "$2");
String forOK = OK.replaceAll(regex, "$3");