需要 java 正则表达式从特定字符串中删除/替换 XML 元素

Need java Regex to remove/replace the XML elements from specific string

提问人:samash 提问时间:4/22/2015 最后编辑:shA.tsamash 更新时间:9/4/2023 访问量:2080

问:

我在获取正确的正则表达式时遇到问题。我有下面的xml作为字符串

    <user_input>
    <UserInput Question="test Q?" Answer=<value>0</value><[email protected]>"
    </user_input>

现在,我只需要从 Answer 属性中删除 xml 字符。 所以我需要以下内容:-

    <user_input>
    <UserInput Question="test Q?" Answer=value0value [email protected]"
    </user_input>

我尝试了以下正则表达式,但没有成功:-

str1.replaceAll("Answer=.*?<([^<]*)>", "$1");

它删除了之前的所有文本。

谁能帮忙?

Java 正则表达式

评论

0赞 Wai Ha Lee 4/22/2015
你能详细说明一下“没有成功”吗?
0赞 Wiktor Stribiżew 4/22/2015
那么,您还想在何处插入一个空格?我们可以在任意位置用空格替换所有空间吗?您不能同时删除和插入,您需要 2 个正则表达式,或 1 个正则表达式和一个简单的替换。><><
0赞 shA.t 9/4/2023
请不要使用正则表达式修改 XML - HTH ;)

答:

0赞 Mazdak 4/22/2015 #1

你需要放在第一组中,使其不贪婪,你也不需要:?Answer=.*?

str1.replaceAll("<([^<]*?)>", "$1")

演示

评论

0赞 samash 4/22/2015
如果我的字符串包含其他一些有效的 xml,如 <userinput>,它不应该触及它,我必须在 Answer Attribute 中删除它。总的来说,在 Answer=“” 之外,它应该不做任何事情
0赞 Mazdak 4/22/2015
@samash 因此,使用正则表达式根本不是解析的好选择,您可以考虑使用合适的解析器!(X)Html
0赞 samash 4/22/2015
我在上面测试了它不起作用 fully.it 也替换了用户输入的标签。
0赞 samash 4/22/2015
问题是我们不必解析 XML,因为我们是中间件,并且 answer 属性中的 xml 片段正在为 end system.so 产生问题,是否有任何正则表达式可以解决我的问题?
0赞 samash 4/22/2015
不,我们没有解析 xml 的选项。但我很确定通过正则表达式可以做到
0赞 Prasanna Kumar H A 4/22/2015 #2

httpRequest.send("msg="+data+"&TC="+TC);试试这个

0赞 Wiktor Stribiżew 4/22/2015 #3

尽管 Java 不支持可变宽度后视,但您可以解决它,这应该就足够了。.{0,1000}

请使用 2 个正则表达式或 1 个正则表达式和 1 个 .选择最适合的那个(我从第一个输入字符串中删除了换行符,以显示使用简单的缺陷):replace\nreplace

String input = "<user_input><UserInput Question=\"test Q?\" Answer=<value>0</value><[email protected]>\"\n</user_input>";
String st = input.replace("><", " ").replaceAll("(?<=Answer=.{0,1000})[<>/]+(?=[^\"]*\")", "");
String st1 = input.replaceAll("(?<=Answer=.{0,1000})><(?=[^\"]*\")", " ").replaceAll("(?<=Answer=.{0,1000})[<>/]+(?=[^\"]*\")", "");
System.out.println(st + "\n" + st1);

示例程序的输出:

<user_input UserInput Question="test Q?" Answer=value0value [email protected]"                                                                                                                                                                          
</user_input>  

<user_input><UserInput Question="test Q?" Answer=value0value [email protected]"                                                                                                                                                                         
</user_input>  
0赞 Phyln 11/30/2022 #4

首先,在上面的示例中,电子邮件后面有一个尾随,我不知道它是否被错误放置。">

但是,我会把它留在那里,因为根据你的预期结果,你需要它仍然存在。

这是我的黑客。

(Answer=)(<)(value)(>)(.+?([^<]*))(</)(value)(><)(.+?([^>]*))(>)将其替换为

$1$3$5$8 $10

解释...

(Answer=)(<)(value)(>)从 Answer 到值 0 的开头匹配

(.+?([^<]*)将结果从 0 或更多开始匹配到开始结束值标记的开头<

(</)在这里,我仍然选择它,因为它在上一个表达式中被删除了

(><)我稍后会用空格替换它

(.+?([^>]*)这与电子邮件开头匹配,不包括 .com 之后的>

(>)这个选择了最后一个,我稍后在替换时会删除它。>

尾随未被选中,因为我宁愿不按要求触摸它。"