【问题标题】:Regex match between two strings that might contain another string可能包含另一个字符串的两个字符串之间的正则表达式匹配
【发布时间】:2014-08-29 10:57:05
【问题描述】:

我正在做一个正则表达式,它试图匹配以下字符串:

.\SQL2012

来自两个字符串(它们包含在另一个更大的字符串中,但在这种情况下无关紧要):

/SERVER "\".\SQL2012\""
/SERVER .\SQL2012

所以在某些情况下,匹配前的"\" 和匹配后的\"" 都可以省略。我想出的正则表达式(来自 StackOverflow 上的上一个问题)如下:

 (?<=\/SERVER\s*(?:[""\\""]+)?)\w+(?=(?:[\\""""]+|$)| )

如果我尝试匹配 TEST_SERVER 而不是 .\SQL2012(因为 \w 不匹配特殊字符),则效果很好。有没有办法匹配任何东西,直到\"" 或出现空格?

我在 C# 中执行此操作,这是我的代码:

string input = "/SERVER \"\\\".\\SQL2012\\\"\"";
string pattern = @"(?<=\/SERVER\s*(?:[""\\""]+)?)\w+(?=(?:[\\""""]+|$)| )";
Regex regEx = new Regex(pattern);
MatchCollection matches = regEx.Matches(input);
foreach (Match match in matches)
{
    Console.WriteLine(match.ToString());
}
Console.ReadKey();

【问题讨论】:

  • 这有 X/Y 问题的味道:你有问题 X,你认为你可以用解决方案 Y 解决它,你在解决方案 Y 中发现问题,现在你正在寻求解决问题的方法在解决方案 Y 中,而解决方案 Y 可能不是解决问题 X 的最佳方法。问题 X 是什么?
  • @NateKerkhofs 这可能是我读过的关于 SO 的最令人费解的评论。我不明白这个问题本身是如何无法理解的。
  • 这个问题本身是完全可以理解的,这是真的。我说的是meta.stackexchange.com/questions/66377/what-is-the-xy-problem。您的正则表达式试图解决我们不知道的问题。但是,您的正则表达式可能不是该问题的最佳解决方案。我感兴趣的是您尝试使用正则表达式解决的问题是什么,以防有比正则表达式更好的解决方案来解决问题。
  • 当你试图对我的问题进行所有元分析时,Avinash 设法回答了它。
  • 你明白我为什么要回答你的问题吗?正则表达式可能不是您实际问题的最佳解决方案。您使用 Regex 解决的问题可能有更好的解决方案。我只是想帮忙。除了您试图在曾经是另一个字符串的一部分的字符串中查找“.\SQL2012”之外,我们没有上下文。我们不知道您为什么要尝试找到它或为什么要使用该方法。检查您之前的问题,您似乎正在尝试从字符串中提取服务器名称。那是配置字符串吗?

标签: c# regex


【解决方案1】:

在前瞻之前添加一个单词边界\b

string input = "/SERVER .\\SQL2012";
Regex rgx = new Regex(@"(?<=\/SERVER\s+""\\"").*?\b(?=\\""""|$| )|(?<=\/SERVER\s+).*?\b(?= |$)");
foreach (Match m in rgx.Matches(input))
Console.WriteLine(m.Groups[0].Value);
Console.WriteLine(input);

IDEONE

【讨论】:

  • 这匹配 "\".\SQL2012
  • 如果字符串是 "somethingelse /SERVER \"\\\".\\SQL2012\\\"\" /something 3"(C# 字符串),那么匹配以下内容:"\ ".\SQL2012\"" /某事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多