我有三个不同的句子,其中包含重复部分。 我想在一个中合并三个不同的正则表达式组,然后将所有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");
答案 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
打破表达:
^((Idle|LOCKED) *)?
- 可能以空闲或锁定开始,后跟零或多个空格\\(?([a-z]+)\\)?
- 可选的括号中嵌入了一系列小写字符(同样,我们希望匹配该序列)(-OK)?$
- 可能以文字-OK
结尾。但仍有一些问题。例如,可选括号不以任何方式捆绑在一起。此外,这会给像Idle (second)-OK
- >这样的化合物带来误报。 second
。
我最初有一个更严格的正则表达式,但其中一个额外的挑战是在要替换的组上保持一致的匹配索引(此处为$3
。)换句话说,有一个整体一组正则表达式,如果你可以使用,在不同的情况下说$k
和$j
,那会更容易。但是,这与开始使用单个正则表达式的整个观点相悖(如果您需要一些预先存在的输入知识,您将要匹配。)更好的是假设我们对内部的内容一无所知标识符locked
,idle
和OK
。
答案 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");