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.