2017-03-09 133 views
1

我有三个不同的句子,其中包含repetetive部分。 我想在一个合并三个不同的正则表达式组,然后将所有的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"); 

回答

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结尾。

虽然还有一些问题。例如,可选的括号没有任何关联。此外,这会给出Idle (second)-OK - >second等化合物的假阳性结果。

我有一个更严格的正则表达式在第一,但附加的挑战之一是保持一致的配建指标上,你愿意(在这里,$3。)换句话说更换组,有一整套的正则表达式如果你可以使用,在不同的情况下说$k$j,那会更容易。但是,这与完成一个单一的正则表达式(如果你需要一些预先存在的输入知识,你将要匹配的)完全相反。更好的方法是假定我们不知道什么是内部的标识符lockedidleOK

+0

谢谢你这样饱和的答案 – Andrew

+0

我可以再问你一个问题吗?当用户键入以下内容时,如何处理大小写敏感的问题:-OK -OK -k -ok。我怎么能忽略这种情况? – Andrew

+0

为什么我会这样做:(?i)([A-Za-z0-9ÆæÅåØø&s] +)( - OK)$ web-page for test:http://www.regexr.com – Andrew

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");