我必须将一些硬编码的字符串移动到外部资源文件,我正在尝试使用正则表达式自动执行一些过程。
但是我在使用它时遇到了一些困难。
示例代码摘录:
public List<string> GetAllProductIDs()
{
var doc = XElement.Load(Path + @"\light.xml");
var elements = doc.Element("products").Elements("product");
// (...)
我使用的正则表达式:
(找到一个以双撇号开头和结尾的字符串,中间不包含另一个双撇号,也不包含换行符;并且在没有第一个和最后一个双撇号的情况下捕获它)
我的目的是
会变成
会发生什么
预期结果:正则表达式匹配var doc = XElement.Load(Path + @ “\ light.xml”);
意外结果:正则表达式匹配* var elements = doc.Element(“products ”)。元素(“ product”); (这是我可以应付的,我只是手动跳过它)
但它不符合 “产品” ,也不符合 “产品”
为什么?
答案 0 :(得分:1)
内置的Visual Studio正则表达式与更常见的正则表达式不同。
问题是\r
按字面解释而不是作为返回控制字符。 appear to be supported by the Visual Studio regex flavor和\r
不是其中之一,只有少数控制字符。因此,引擎正在使用它。
要验证这一点,请将\r
更改为\a
,您会发现它与“产品”和“产品”匹配就好了。原因是这些单词中不存在文字字符“a”,因此匹配成功,而\r
使匹配失败,因为字母“r”确实存在于这些单词中。
要解决此问题,您可以通过其Unicode十六进制值(000D
)来引用返回控制字符。将\r
更改为\u000D
或\x0D
:
"{([^"\u000D]*)}"
或
"{([^"\x0D]*)}"
您可能有兴趣查看Visual Studio Productivity Power Tools,它支持大多数人习惯的.NET Regex风格。使用该工具,您将使用:
"([^"\r]*)"
请注意\r
在这种情况下按预期工作。Resources.$1
答案 1 :(得分:0)
我正在尝试替换xml:
替换:
<metaKeyword2>Avaeon.Topoix.Gravity.Add</metaKeyword2>
用这个
<metaKeywords>
<metaKeyword>
<keyword>Avaeon.Topoix.Gravity.Add</keyword>
</metaKeyword>
</metaKeywords>
属性中的值是可变的,我似乎无法得到它,我怀疑XML的&lt; &GT;打破它,这是我尝试过的
<metaKeyword2>:w</metaKeyword2>
与
<metaKeywords>
<metaKeyword>
<keyword>\1</keyword>
</metaKeyword>
</metaKeywords>
但它一无所获。