2012-03-30 58 views
4

如果整个字符串不是“M”,“F”,则我需要一个在Java中使用的正则表达式来替换带有“UNKNOWN”或“M/F”。换句话说:正则表达式除了“M”,“F”,“M/F”之外的所有东西

  • 字符串 “M” 保持 “M”
  • 字符串 “F” 保持 “F”
  • 字符串 “M/F” 保持 “M/F”
  • 别的变“UNKNOWN”

一个奇怪的情况是“M /”或“F /”,它应该变成“UNKNOWN”。请帮忙,我在这里死去。

我实际上是通过xml映射文件将正则表达式传递到框架中,所以我没有对如何形成输出的程序控制。我只能通过一个正则表达式,以及它被替换的东西。

+2

你为什么要使用这个正则表达式,而不是常规字符串比较和有条件的字符串赋值? – Bernd 2012-03-30 20:58:09

+1

这是否需要是一个正则表达式?你只有三个字符串来检查。 – 2012-03-30 20:58:29

回答

3

可以使用负前瞻是这样的:

Pattern.compile("^(?!^(?:M|F|M/F)$).*$"); 

使用字符串#的replaceAll你可以这样做:

String replaced = str.replaceAll("^(?!^(?:M|F|M/F)$).*$", "UNKNOWN"); 
+0

确实。只需用UNKNOWN替换这个匹配即可。 – Dave 2012-03-30 21:04:27

+0

这样做。我不知道负向预测(或者对于这个问题的常规预测)。谢谢一堆。 – Mario 2012-03-30 21:07:11

+0

不客气。这是非常有用的阅读正则表达式lookarounds:http://www.regular-expressions.info/lookaround.html – anubhava 2012-03-30 21:09:01

0

您可以测试该字符串是否匹配^(M|F|M/F)$和替换它,如果它不比赛。在伪代码(因为我不记得怎么做正则表达式在Java中):

s = "M" 
if not match(s, '^(M|F|M/F)$') 
    s = "UNKNOWN" 
+0

我的问题是,我实际上是通过xml映射文件传递正则表达式到一个框架,所以我对于输出如何形成没有程序控制。我只能通过一个正则表达式,以及它被替换的东西。 – Mario 2012-03-30 21:05:27

0
if (!Pattern.matches("^M$|^F$|^M/F$", string)) { 
    string = "UNKNOWN"; 
} 

哦,这是相同的答案,因为劳伦斯的..我会去为单一的情况下,虽然.. aaand我看到它不是你想要的..对不起:)

相关问题