Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换java字符串中的正则表达式,该字符串包含`
`符号_Java_Regex_Replace - Fatal编程技术网

替换java字符串中的正则表达式,该字符串包含`
`符号

替换java字符串中的正则表达式,该字符串包含`&#xA;`符号,java,regex,replace,Java,Regex,Replace,我必须通过java替换这个xml字符串的内容 <My:tag>value_1 22&#xA;value_2 54&#xA;value_3 11</My:tag> value_1 22 ;值2 54和xA;价值3 11 因此,这个字符串是从xml中提取的,当我获取它时,我得到了以下结果: <My:tag>value_1 22 value_2 54 value_3 11</My:tag> 值\u 1 22 价值2 54 价值

我必须通过java替换这个xml字符串的内容

<My:tag>value_1 22&#xA;value_2 54&#xA;value_3 11</My:tag>
value_1 22
;值2 54和xA;价值3 11
因此,这个字符串是从xml中提取的,当我获取它时,我得到了以下结果:

<My:tag>value_1 22
value_2 54
value_3 11</My:tag>
值\u 1 22
价值2 54
价值3 11
如果我尝试以这种方式替换内容:

String regex =  "(<My:tag>)(.*)(</My:tag>)";
String new_string = old_string.replaceAll(regex,"<My:tag> new_stuff </My:tag>");
String regex=“()(.*)()”;
String new_String=old_String.replaceAll(regex,“new_stuff”);
我没有结果。我想是因为
和#xA符号

但是如果我尝试替换不带

符号,一切正常

建议?
谢谢

我建议使用XML库,比如or,来处理XML,而不是使用正则表达式。

我不能100%确定java正则表达式引擎是如何工作的,但我无法想象一个实体会给您带来问题。您应该首先尝试删除括号,因为您要替换整个表达式,而不是提取任何内容

但是,可能导致这种情况的原因是,如果您的实体实际被转换为新行,则可能是您的正则表达式无法捕获它,除非您显式地进行多行匹配。你也可以试着去做

[.\n]*
而不是你的

.*
这可能是一个贪婪的出价,但回溯到很多匹配处理。不幸的是,我没有在这台机器上安装任何java东西,所以我不能真正尝试和测试它。另一种可能是积极寻找下一个开口角括号,如下所示:

[^<]* 

[^我不明白为什么
本身会引起任何问题-除非它在某个时候转换为实际的换行符

如果是这种情况,则需要启用DOTALL模式,以便

要启用DOTALL,只需使用
(?s)

启动表达式即可 (如果创建了图案对象,还可以将该标志传递给该图案对象。)

无论如何,试试这个:

String regex =  "(?s)(?<=<(My:tag)>).*?(?=</\1>)";
String new_string = old_string.replaceAll(regex,"new_stuff");

如果你只需要做一点文本操作,JDOM和DOM4J似乎有些过分了。如果你需要做大规模的东西,你是对的,但是对于这个…不,确切地说,我只需要像这样操作字符串,我不认为这是使用另一个库的情况…使用XML库的另一个优点是,操作的结果是被认为是格式良好的XML——这就是XML的全部意义,不是吗?这似乎不起作用,但我不使用任何额外的库。如果你想在这里做一些实验,Java有(?s)标志用于DOTALL模式启用。匹配换行符。事实上,[.]将匹配实际的。而不是任何字符。另外,[^>]*将按预期工作,并且不会与词尾冲突。只是澄清一下-它应该是[^您可能对<和\表示单词的结束,但是Perl、Java和大多数其他风格使用\b表示单词的开始或结束。无论是否转义,角括号都与角括号匹配。您是对的,在Perl和Java中\b表示单词边界,\<和\>是Posix正则表达式(我所说的“标准”,但可能我已经过时了)但是,你对perl的看法是对的,我一定把它与分组括号(posix中的转义括号,但不是perl中的转义括号)混淆了。Giancarlo:我建议使用
regex
标记,而不是
正则表达式
,因为它更受欢迎(因此更多的人会发现你的问题)。由于存在5个标记的限制,并且xA不是人们搜索的特定术语,因此我已将该标记替换为
regex
1。是的,如果问题描述准确,则在应用regex之前,必须将实体替换为换行符。此外,您应该使用非贪婪点星(.*)一直以来,但在DOTALL模式下进行匹配时,这一点更为重要。这有点含糊不清;我的意思是GIANCARLO应该像Peter一样使用非贪婪的点星。
<My:tag> new_stuff </My:tag>
<My:tag>value_1 22&#xA;value_2 54&#xA;value_3 11</My:tag>
String regex =  "(?s)(?<=<(My:tag)>).*?(?=</\1>)";
String new_string = old_string.replaceAll(regex,"new_stuff");
String regex =  "(?<=<(My:tag)>)(?s:.*?)(?=</\1>)";