C# 用于在匹配引号之间选择数据的正则表达式模式

C# 用于在匹配引号之间选择数据的正则表达式模式,c#,regex,vb.net,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: (\"[^"]*?)(

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

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
我遇到的问题是,使用这种模式时,它不考虑引号是在打开还是关闭语句

因此,在上面的示例中,
本身
中的
-
字符将被一个空格替换,因为它位于两个引号之间,但位于结束标记和开始标记之间——当我特别想查看开始标记和结束标记之间的文本时

在这样的正则表达式中,您如何解释这一点

我希望这是有道理的

我正在使用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.

谢谢

为了解决这个问题,我绞尽脑汁,结果发现,指定非单词边界
\B
可以达到以下目的:

正则表达式
\B(“[^”]*)-([^”]*”)\B

替换
$1$2


演示

我将使用引号“作为分隔符,将字符串拆分为字符串数组。
然后,所有具有奇数索引的字符串都将是一对引号内的字符串,仅在aSplittedString[oddIndex]上使用正则表达式,然后用“.”连接整个数组

您需要做的是显式地只匹配引号中包含
-
的字符串

使用以下命令:

(\"[^"]*.*?)-(.*?\")
工作示例:


这里唯一的问题是,它只适用于引号中的
word
的单个实例。例如,如果您有word和word,那么它将失败。

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

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();
}

您遇到的问题与试图匹配HTML或开始括号和结束括号的人相同,正则表达式只能匹配常规语言,并且知道哪个
是结束语,而开始语除了琐碎的情况外,其他任何东西都无法达到

编辑:如Vasili Syrakis的回答所示,有时可以这样做,但对于这类问题,正则表达式是一个脆弱的解决方案

话虽如此,您可以在简单的情况下转换您的问题。因为您使用的是.NET,所以您可以简单地匹配每个带引号的字符串和用法

测试:


我不想让它工作…这也说明了匹配引号和只在它们之间替换吗?更改它,现在试试。哇-它工作了!!!!你太棒了-我将接受你的答案,但还有一个简单的问题…你知道如何将它改为考虑引号之间的多个
-
还是t这是一罐更难看的虫子??嗯……我确信这是可能的,我只是不知道怎么做:P我也试了10分钟左右,因为我也想知道答案。雷姆斯,谢谢!!-2个问题,不过……我的第一个问题(我在问题中没有包括的是,我如何改变这一点,以说明QOUTIONS之间的多个
-
。其次,也是更重要的是,这仍然改变了
本身
,它不应该:(当你进入像这样的有条件的东西时,你最好像约翰·科纳建议的那样编写一个适当的函数。谢谢!-我希望正则表达式有某种“前瞻”/“匹配“能够抓取该文本,然后从上次匹配结束的地方重新开始…确实如此,但要处理多个捕获组,然后添加否定(所有这些都要做,除了…)。这只会带来麻烦和大量的处理开销(regex非常昂贵)。谢谢,John-我知道我可以用一种方法来完成这项工作(顺便说一句,这是一种很好的方式),但我更想知道如何使用正则表达式来实现这一点,因为我认为在我的武器库中使用正则表达式可能是一件很棒的事情。不过,谢谢!!!很酷的想法!!!!+1!!-如果可能的话,我仍然很想知道如何使用正则表达式来实现这一点。这绝对是一个很酷的把戏!!!而且肯定+1-我仍然很好奇,你gh,看看是否可以直接用正则表达式来实现这一点。@JohnBustos:Vache是对的,没有一种纯粹的正则表达式解决方案是不粗糙和脆弱的。感谢您使用的正则表达式风格(.NET)不仅支持lambda,而且使它们易于使用。
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(" "));
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.