正则表达式模式问题c#

时间:2016-01-25 12:00:54

标签: c# regex

我在这里遇到一点麻烦。我试图找到一个匹配所有不良示例的正则表达式:

  • 方法("团队详情")

    应该返回:团队详情

  • 方法(@"团队 详情项目

    以及更多

    和 更" )

    应该返回:团队详情项目以及越来越多的

  • 方法("团队\"详细信息\"")

    应该返回:Team" Details"

  • 方法(@"团队""详细信息""")

    应该返回:团队"详细信息"

  • 方法(@"团队

    ""详情""" )

    应该返回:团队

    "详情"

我设法创建了一个正则表达式模式:

Method\(.*\"(.*)\".*\)

whcih在第一个例子中工作,部分在第二个例子中工作,但我发现很难为所有5个例子创建一个模式。有什么帮助吗?

干杯

2 个答案:

答案 0 :(得分:2)

默认情况下,

.仅匹配非换行符,因此如果匹配跨越多行,则正则表达式将失败。如果您使用(?s)模式修饰符更改了该行为,则需要确保匹配不会变得太长。

实现这一目标的最简单方法是使*量词变得懒惰。

(?s)Method\(.*?\"(.*?)\".*?\)

这对您的示例有效,但如果"Details..."字符串中有任何右括号,则会失败。

通过限制允许的字符集,考虑转义或加倍引号,您可以使其更强大:

Method\([^\"]*\"((?:""|\\.|[^\"\\]+)*)\"[^\"]*\)

测试live on regex101.com

这个不能做的是更改匹配的内容(即,删除额外的空格或转换引号,如您所料) - 这不能在单个正则表达式中完成。但是你可以对这个正则表达式的匹配应用更多的转换步骤并进一步处理它们。

答案 1 :(得分:1)

使用如下表达式:Method\(\s*@?(.+?)\)(示例here)。您需要包含s标志。这将允许句点字符也匹配新行,这是您的第二个示例所需的内容。

一旦你拥有了你所追求的字符串(包含在一个正则表达式组中),你可以使用通常的替换操作来格式化你想要的文本。这应该会产生一种更灵活,更容易理解的解决方案。