java正则表达式并替换所有引用
我想在一个大字符串中替换一个字符串,但我想我的正则表达式不合适。所以它不起作用了 主字符串为 要替换的某些sql部件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
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名称开头的,因此这也不起作用。在这里把/和^都除掉^
是一个空白字符(有许多空白字符-这与其中任何一个匹配,但正好一个)。您的字符串没有任何空格。您的意图当然是将0与其中许多匹配的\\s
,即:\\s*
是:“此处允许空白”\\s*
是:此处必须只有一个空格字符。将regexp中的所有\\s
设置为\\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代码都工作了。我误解了动态数据,认为它不工作。非常感谢您的帮助。