提问人:samash 提问时间:4/22/2015 最后编辑:shA.tsamash 更新时间:9/4/2023 访问量:2080
需要 java 正则表达式从特定字符串中删除/替换 XML 元素
Need java Regex to remove/replace the XML elements from specific string
问:
我在获取正确的正则表达式时遇到问题。我有下面的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");
它删除了之前的所有文本。
谁能帮忙?
答:
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
\n
replace
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 之后的>
(>)
这个选择了最后一个,我稍后在替换时会删除它。>
尾随未被选中,因为我宁愿不按要求触摸它。"
评论
><
><