正则表达式在Regexr工作但不是C#,为什么?

时间:2016-05-09 14:15:20

标签: c# regex

从下面提到的输入字符串中,我想为s:ds字段提取{}中指定的值。我附上了我的正则表达式。现在我用于http://www.regexr.com/测试的模式是:

s:ds=\\\"({[\d\w]{8}\-([\d\w]{4}\-){3}[\d\w]{12}})\\\" 

它的工作非常好。

但是C#代码中的相同功能不起作用。我还为c#代码添加了\\而不是\并替换了\"用\"" 。如果我做错了,请告诉我。以下是代码段。

string inputString is "s:ds=\"{46C01EB7-6D43-4E2A-9267-608DE8AFA311}\" s:ds=\"{37BA4BA0-581C-40DC-A542-FFD9E99BC345}\" s:id=\"{C091E71D-4817-49BC-B120-56CE88BC52C2}\"";

string regex = @"s:ds=\\\""({[\d\w]{8}\-(?:[\d\w]{4}\-){3}[\d\w]{12}})\\\""";
MatchCollection matchCollection = Regex.Matches(layoutField, regex);
if (matchCollection.Count > 1)
{
  Log.Info("Collection Found.", this);
}

2 个答案:

答案 0 :(得分:1)

如果您只是为了匹配值...

如果你只想匹配你的鸥翼支撑,你应该能够只使用([\d\w]{8}\-([\d\w]{4}\-){3}[\d\w]{12})

string input = "s:ds=\"{46C01EB7-6D43-4E2A-9267-608DE8AFA311} ...";
// Use the following expression to just match your GUID values
string regex = @"([\d\w]{8}\-([\d\w]{4}\-){3}[\d\w]{12})";
// Store your matches
MatchCollection matchCollection = Regex.Matches(input, regex);
// Iterate through each one
foreach(var match in matchCollection)
{
      // Output the match 
      Console.WriteLine("Collection Found : {0}", match);
}

您可以see a working example of this in action here和示例输出如下所示:

enter image description here

如果您只想匹配s:ds ...

后面的人

如果您只想捕获s:ds部分的值,可以考虑将(?<=(s:ds=""{))附加到表达式的前面,这将a look-behind只匹配值以“s:ds = {”:

开头
string regex = @"(?<=(s:ds=""{))([\d\w]{8}\-([\d\w]{4}\-){3}[\d\w]{12})";

您可以see an example of this approach here并在下面进行演示(请注意它与s:id元素不符:

enter image description here

另一个考虑因素

目前,您使用\w来匹配表达式中的“字”字符,虽然这可能适合您的使用,但它会匹配所有数字\d,字母a-zA-z和下划线{ {1}}。您不太可能需要其中的一些,因此您可能需要考虑修改您的字符集以使用您期望的_仅匹配大写字母和数字或[A-Z\d]如果您只是预期的GUID值(例如十六进制)。

答案 1 :(得分:0)

看起来你可能过度逃避了。

试一试:

import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { override func viewDidLoad() { super.viewDidLoad() self.myTableView.allowsMultipleSelection = true } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = UITableViewCellAccessoryType.Checkmark } func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { tableView.cellForRowAtIndexPath(indexPath)?.accessoryType = UITableViewCellAccessoryType.None }