java正则表达式并替换所有引用

java正则表达式并替换所有引用,java,regex,replace,Java,Regex,Replace,我想在一个大字符串中替换一个字符串,但我想我的正则表达式不合适。所以它不起作用了 主字符串为 要替换的某些sql部件 cond = emp.EMAIL_ID = 'xx@xx.com' AND emp.PERMANENT_ADDR LIKE('%98n%') AND hemp.EMPLOYEE_NAME = 'xxx' and is_active='Y' hemp.EMPLOYEE_NAME = 'xxx' 要查找和替换的字符串为 根据某些条件,需要更换sql部件 cond = emp

我想在一个大字符串中替换一个字符串,但我想我的正则表达式不合适。所以它不起作用了

主字符串为

要替换的某些sql部件

cond =  emp.EMAIL_ID = 'xx@xx.com' AND
emp.PERMANENT_ADDR LIKE('%98n%') 
AND hemp.EMPLOYEE_NAME = 'xxx' and is_active='Y'
hemp.EMPLOYEE_NAME = 'xxx'
要查找和替换的字符串为

根据某些条件,需要更换sql部件

cond =  emp.EMAIL_ID = 'xx@xx.com' AND
emp.PERMANENT_ADDR LIKE('%98n%') 
AND hemp.EMPLOYEE_NAME = 'xxx' and is_active='Y'
hemp.EMPLOYEE_NAME = 'xxx'
我已经用

使用模式和匹配器类

Pattern pat1 = Pattern.compile("/^hemp.EMPLOYEE_NAME\\s=\\s\'\\w\'\\s[and|or]*/$", Pattern.CASE_INSENSITIVE);
        
        Matcher mat = pat1.matcher(cond);
         while (mat.find()) {
                     System.out.println("Match: " + mat.group());
                    cond = mat.replaceFirst("xx "+mat.group()+"x");
                    mat = pat1.matcher(cond);
        
        }

它不工作,根本没有进入循环。非常感谢您的帮助。

显然不是-您的regexp模式没有任何意义

  • 开头
    /
    :在某些语言中,regexp不是字符串,而是以开头斜杠开头Java不是这些语言中的一种,它与regexp本身无关。因此,这在SQL中查找一个文本斜杠,它不存在,因此失败
  • ^
    是“字符串开头”的regexpse。您的字符串不是以hemp.EMPLOYEE\u名称开头的,因此这也不起作用。在这里把/和^都除掉
  • \\s
    是一个空白字符(有许多空白字符-这与其中任何一个匹配,但正好一个)。您的字符串没有任何空格。您的意图当然是将0与其中许多匹配的
    \\s*
    ,即:
    \\s*
    是:“此处允许空白”
    \\s
    是:此处必须只有一个空格字符。将regexp中的所有
    \\s
    设置为
    \\s*
  • \\w
    正好是一个“单词”字符(或多或少是一个字母或数字),您显然想要
    \\w*
  • [和|或]
    这是“a、n、d、o、r或管道符号”的regexpse。很明显,您正在查找的是
    (和|或)
    ,它是regexpse的:序列“
    ”,或者序列“
  • *
    -所以你想要0到多个“and”或“or”,这毫无意义
  • 结束斜杠:你不想要这个
  • 关闭
    $
    :您不需要这个-它表示“字符串结束”。你的绳子没有在这里结束
守则本身:

replaceFirst
本身也执行regexp。你不想重复使用这些东西。这不是替换已找到结果的方式

这就是你想要的:

Matcher mat = pat1.matcher(cond);
mat.replaceFirst("replacement goes here");
其中,如果您希望获取匹配的部分内容,则替换可以包括对匹配中的组的引用(即,不要使用
mat.group()
,请使用这些引用)

更一般地说,您是否阅读过任何regexp教程,是否进行过任何测试,或者是否阅读过和的javadoc


我已经发展了几年了。这可能只是个人经历,但阅读是非常基本的。

你可以使用单词边界
\b
来防止部分匹配,而不是锚定
^
$

如果要匹配同一行上的空格,可以使用
\h
匹配水平空格字符,因为
\s
也可以匹配换行符

(?i)\bhemp\.EMPLOYEE_NAME\h*=\h*'\w+'\h+(?:and|or)\b
您可以在字符串上使用
$0
获得完全匹配,并使用内联修饰符
(?i)
获得不区分大小写的匹配

注意使用
[和|或]
是匹配列出的字符之一,并转义点以逐字匹配,或者
匹配除换行符以外的任何字符

(?i)\bhemp\.EMPLOYEE_NAME\h*=\h*'\w+'\h+(?:and|or)\b
看到一个或一个

比如说

String regex = "\\bhemp\\.EMPLOYEE_NAME\\h*=\\h*'\\w+'\\h+(?:and|or)\\b";
String string = "cond =  emp.EMAIL_ID = 'xx@xx.com' AND\n"
+ "emp.PERMANENT_ADDR LIKE('%98n%') \n"
+ "AND hemp.EMPLOYEE_NAME = 'xxx' and is_active='Y'";

System.out.println(string.replaceFirst(regex, "xx$0x"));
输出

cond =  emp.EMAIL_ID = 'xx@xx.com' AND
emp.PERMANENT_ADDR LIKE('%98n%') 
AND xxhemp.EMPLOYEE_NAME = 'xxx' andx is_active='Y'

非常感谢。如果最后没有空格或and |或,如何匹配?可能会发生在hemp.EMPLOYEE_NAME='xxx'之后什么都没有。那么这个regx不起作用了。如何做?@mou您可以将最后一部分设置为可选的
(?i)\bhemp\.EMPLOYEE\u NAME\h*=\h*'\w+'(?:\h+(?:和|或)\b)
查看它在regx编辑器中的工作情况,但索引26(?i)\bhemp\.EMPLOYEE\u NAME\h*=\h*'\w+'(?:\h+(?:)和|或)\b)附近的转义序列非法/不受支持?在java中。当我用\s替换它时,它不工作。是的,模式和java代码都工作了。我误解了动态数据,认为它不工作。非常感谢您的帮助。