我必须在xml中使用regEx第一个元素名称进行提取(忽略可选的名称空间前缀。
以下是XML1示例:
<ns1:Monkey xmlns="http://myurlisrighthereheremonkey.com/monkeynamespace">
<foodType>
<vegtables>
<carrots>1</carrots>
</vegtables>
<foodType>
</ns1:Monkey>
这是类似的XML,没有命名空间,XML2:
<Monkey xmlns="http://myurlisrighthereheremonkey.com/monkeynamespace">
<foodType>
<vegtables>
<carrots>1</carrots>
</vegtables>
<foodType>
</Monkey>
我需要一个regEx,它会为XML1或XML2返回“Monkey”
到目前为止,我尝试了HERE这个适用于XML1的regEx&lt;(\ _ w +:)(\ w +)....但我不知道如何让它适用于XML2
答案 0 :(得分:2)
由于它似乎是一次性工作,并且您实际上无法访问XML解析器,因此您可以使用2个正则表达式中的任何一个(仅适用于您提供的XML文件样本):
<(\w+:)?(\w+)(?=\s*xmlns="http://myurlisrighthereheremonkey\.com/monkeynamespace")
或者(如果使用正则表达式检查整个单个文件内容):
^\s*<(\w+:)?(\w+)
主要变化是2:
(\w+:)?
- 添加?
修饰符可使第一个捕获组成为可选^\s*
在字符串的开头进行正则表达式匹配(猜测你没有XML声明),或者(?=\s*xmlns="http://myurlisrighthereheremonkey.com/monkeynamespace")
前瞻强制匹配只有后跟可选空格和文字{ {1}}。但是,您确实需要考虑更改支持XML解析的代码,它将使您负责维护代码的人的生活和生活变得更容易。