使用正则表达式替换字符串中的特定字符

5

我是一个新手,希望能得到一些regex方面的帮助。我有动态生成的输入字符串,其中的一个示例:

(ACTOR > 0OR(PROC <> NULL AND REVIEW=NULL ANDFERDINAND = NAME ) )

现在我需要用|替换OR,用&替换AND,用==替换=,用!=替换<>,并在字符之间提供一个空格,但不包括原有空格。
通常我可以使用string.replace()来完成这个任务。但是,由于语句可能带有或不带有空格,甚至由于AND可能出现在其他单词中,比如FERDINAND,所以我觉得有点困难。
期望的结果:
( ACTOR > 0 | ( PROC != NULL & REVIEW == NULL & FERDINAND == NAME ) )

我在想是否有人可以帮助我解决这个问题。提前致谢。


如果将“AND”替换为“&”(两侧加空格),会发生什么? - Geno Chen
那么,原始字符串> 0OR是一个错误还是就是这样的呢? - Geno Chen
@GenoChen:针对你的第一个问题,不行,这样做行不通。因为无法保证在 AND 前后都存在空格。 - Phillip
尝试使用.replaceAll("\\s*(?<![a-zA-Z])OR(?!\\s*[<>=!])\\s*", " | ") .replaceAll("\\s*(?<![a-zA-Z])AND(?!\\s*[<>=!])\\s*", " & ") .replaceAll("\\s*=\\s*", " == ") .replaceAll("\\s*<>\\s*", " != ") - Wiktor Stribiżew
@WiktorStribiżew:您的答案很好。您介意将其作为答案发布并附上一些解释,以便我可以接受它吗? - Phillip
显示剩余2条评论
1个回答

0
你可以尝试这个,但是无法处理 ANDFERDINAND 这种情况。这里不适合使用正则表达式,因为没有简单的标准来确定分隔符。
String str2 = str1
      .replaceAll("([0-9])(?=[A-Z])", "$1 ")                 //1
      .replaceAll("\\bAND\\b", "&")                          //2
      .replaceAll("\\bOR\\b", "|")                           //3
      .replaceAll("(?<![=<>!])=(?!=)", "==")                 //4
      .replaceAll("<>", "!=")                                //5
      .replaceAll("(?<=[^&| ])(==|!=|&|\\)|\\|)", " $1")     //6
      .replaceAll("(==|!=|&|\\(|\\)|\\|)(?=[^ &|])", "$1 "); //7

首先,将数字和单词字符(正向预查)分开。

其次,将单词边界处的ANDOR替换为第二个和第三个。

第四步,如果=不是==!=<=>=的一部分,则进行替换(负向前瞻和负向预查)。

第五步,进行<>的简单匹配。

第六步和第七步使得==!=&()|被空格包围,但不要在字符串的开头或结尾添加空格。它们只会被替换,除非紧接着前面或后面跟着&|

我只对大写字母做了这个操作。如果您还需要处理小写字母,可以轻松适应。


对于字符串 CLASS_SUM >= 10 && COUNTRY != USA,输出结果为 CLASS__SUM > == 10 && COUNTRY ! == USA,这是错误的。请您检查一下? - Phillip
是的,这不包括在原始问题中,但很容易解决。我会修改我的答案。也许,在你进行广泛测试时,还有更多的情况。你应该尝试学习正则表达式。它并不太难理解,你可以为自己修改模式。 - Donat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接