正则表达式模式选择BETWEEN匹配引号的数据

时间:2014-01-13 21:55:24

标签: c# regex vb.net

假设我有以下字符串,我想在其上运行正则表达式:

This is a test string with "quotation-marks" within it.
The "problem" I am having, per-se, is "knowing" which "quotation-marks"
go with which words.

现在,假设我想将引号之间的所有-个字符替换为空格。我认为我可以使用正则表达式进行如下操作:

Find What:      (\"[^"]*?)(\-)([^"]*?\")
Replace With:   $1 $3

我遇到的问题是使用这种模式时,它没有考虑引号是打开还是关闭语句。

因此,在上面的示例中,-中的per-se字符将替换为空格,因为它在2个引号之间,但在结束和开始标记之间 - 当我特意想在开始和结束标记之间查看文本时。

你如何用这样的正则表达式解释这个问题?

我希望这是有道理的。

我正在使用VB / C#Regex。


只是为了完成这个问题(并希望在必要时再详细说明),我想得到的最终结果是:

This is a test string with "quotation marks" within it.
The "problem" I am having, per-se, is "knowing" which "quotation marks"
go with which words.

谢谢!

5 个答案:

答案 0 :(得分:8)

您遇到与尝试匹配HTML或打开和关闭括号的人相同的问题,正则表达式只能匹配常规语言,并且知道哪个"是关闭,而开放的语言是不可及的除了琐碎的案件之外别无其他。

编辑:如Vasili Syrakis的回答所示,有时它可以完成,但正则表达式是解决此类问题的脆弱解决方案。

话虽如此,你可以在琐碎的情况下转换你的问题。由于您使用的是.NET,因此您只需匹配每个引用的字符串并使用the overload that takes a match evaluator

Regex.Replace(text, "\".*?\"", m => m.Value.Replace("-", " "))

测试:

var text = @"This is a test string with ""quotation-marks"" within it.
The ""problem"" I am having, per-se, is ""knowing"" which ""quotation-marks""
go with which words.";

Console.Write(Regex.Replace(text, "\".*?\"", m => m.Value.Replace("-", " ")));
//This is a test string with "quotation marks" within it.
//The "problem" I am having, per-se, is "knowing" which "quotation marks"
//go with which words. 

答案 1 :(得分:6)

而不是正则表达式,从长远来看,执行此操作的常规方法可能更易于维护:

public static String replaceDashInQuotes(this string source, String newValue)
{
    StringBuilder sb = new StringBuilder();

    bool inquote = false;

    for (int i = 0; i < source.Length; i++)
    {
        if (source[i] == '\"')
            inquote = !inquote;

        if (source[i] == '-' && inquote)
            sb.Append(newValue);
        else
            sb.Append(source[i]);
    }

    return sb.ToString();
}

然后使用它:

var s = @"This is a test string with ""quotation-marks"" within it.
    The ""problem"" I am having, per-se, is ""knowing"" which ""quotation-marks""
    go with which words.";

MessageBox.Show(s.replaceDashInQuotes(" "));

答案 2 :(得分:5)

让我的大脑深思熟虑,结果指出非单词边界\B可以解决问题:

正则表达式

\B("[^"]*)-([^"]*")\B

替换

$1 $2


演示

http://regex101.com/r/dS0bH8

答案 3 :(得分:1)

我将字符串拆分为一个字符串数组,使用引号“作为分隔符。 然后所有带有奇数索引的字符串将是一对引号中的字符串,仅在aSplittedString [oddIndex]上使用你的正则表达式,然后用“。

连接整个数组。

答案 4 :(得分:1)

您需要做的是明确地只匹配拥有 -的引号内的字符串。

使用此:

(\"[^"]*.*?)-(.*?\")

工作示例:http://regex101.com/r/jK5eL9

这里唯一的问题是它只适用于引号中word-word的单个实例。如果你有,"word-word, and word-word"它会失败。