regex - 正则表达式处理 XML 标记 - 需要帮助
问题描述
我有一些我正在尝试清理的伪 XML,而且我已经完成了大部分工作,但是标签中的大小写存在问题。
我的来源看起来像这样......
<?xml version="1.0" encoding="UTF-8"?>
<root>
<float_node>1.0</float_node>
<text_node>Pack My Box</text_node>
<UPPER_NODE>With Five Dozen</UPPER_NODE>
<MiXeD_NoDe>SCSG1</MiXeD_NoDe>
<!-- Comment should not be changed -->
<GRANDPARENT>
<PARENT>
<Child1>Liquor Jugs</Child1>
<Child2 with-attribute="Pangrams">Jackdaws Love</Child2>
</PARENT>
<PARENT>
<Child1>My Big Sphinx</Child1>
<Child2 with-attribute="Are Great">Of Gold</Child2>
</PARENT>
</GRANDPARENT>
</root>
但我想要的是这个……
<?xml version="1.0" encoding="UTF-8"?>
<root>
<float_node>1.0</float_node>
<text_node>Pack My Box</text_node>
<upper_node>With Five Dozen</upper_node>
<mixed_node>SCSG1</mixed_node>
<!-- Comment should not be changed -->
<grandparent>
<parent>
<child1>Liquor Jugs</child1>
<child2 with-attribute="Pangrams">Jackdaws Love</child2>
</parent>
<parent>
<child1>My Big Sphinx</child1>
<child2 with-attribute="Are Great">Of Gold</child2>
</parent>
</grandparent>
</root>
到目前为止,我有这个模式......
<(.+)( .+)?>(.*)<\/\1>
而这个替代...
<\L$1$2>$3</\L$1>
但输出是错误的......
<?xml version="1.0" encoding="UTF-8"?>
<root>
<float_node>1.0</float_node>
<text_node>pack my box</text_node>
<upper_node>with five dozen</upper_node>
<mixed_node>scsg1</mixed_node>
<data_format>excel</data_format>
<!-- Comment should not be changed -->
<GRANDPARENT>
<PARENT>
<child1>liquor jugs</child1>
<child2 with-attribute="pangrams">jackdaws love</child2>
</PARENT>
<PARENT>
<child1>my big sphinx</child1>
<child2 with-attribute="are great">of gold</child2>
</PARENT>
</GRANDPARENT>
</root>
\L 小写字母被应用于标签内容和属性以及标签,即使替换字符串有 $2 和 $3 不同且未更改。
嵌套节点被忽略。只有最里面的节点被改变。我应该如何管理层次结构?
谁能告诉我我的模式或替换在哪里失败?
我正在使用 Regex101 来帮助构建正则表达式模式和测试... https://regex101.com/r/Oeshto/3
(我使用 Notepad++ 进行实际工作,因为我的首选编辑器(VSCode)不处理所需的 \L 转换。)
解决方案
以下是满足您需求的正则表达式。我确信一些 reg-ex 向导可以优化或使这些更好,但他们似乎完成了工作。(已编辑,我已经删除了我对 PEAR 包的建议,因为当您只要求正则表达式时,这完全是无稽之谈)
Regular Expression.: /(<\/?[^!][^>]+)/g ( Change all tags+attributes )
Regular Expression.: /(<\w+|<\/\w+)/g ( Change only tags )
Substitution.......: \L$1
不要忘记全局标志,这样它就不会在第一个结果后返回。这应该匹配所有标签。
推荐阅读
- flutter - 为什么 ScanStreamTransformer 不返回任何东西
- machine-learning - PyTorch 绘制损失曲线
- java - 休眠 - @OneToOne 关系
- android - 我使用最新的 Android Studio 4.1.2 版本(Android Gradle 插件 4.1.2)我在添加生命周期库(用于 DataBinding)时遇到问题
- python - 我的模型属性过滤总和并回答正确,但给了我每一行我拥有的数据库
- sql - 创建视图时生成 ORA-00942 错误
- c - 使用 fopen 的相对路径
- java - GraphAPI com.microsoft.graph.core.ClientException 引起:java.lang.IllegalStateException
- python - 分类模型的参数产生不同的结果
- spring - java.sql.SQLNonTransientConnectionException:无法创建与数据库服务器的连接 - Google Cloud Platform