假设我有以下字符串,我希望在以下字符串上运行正则表达式:
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中将被一个空格所取代,因为它位于两个引号之间,但在结束和开口标记之间--当我特别希望查看开头和结束标记之间的文本时。
您如何在这样一个正则表达式中解释这一点?
我希望这是合理的。
我正在使用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.谢谢!!
发布于 2014-01-13 21:59:35
为了解决这个问题,我绞尽脑汁,结果发现,指定non \B会起作用:
正则表达式
\B("[^"]*)-([^"]*")\B
替换
$1 $2
演示
http://regex101.com/r/dS0bH8
发布于 2014-01-13 22:12:06
与那些试图匹配HTML或打开和结束括号的人一样,regex只能匹配常规语言,并且知道哪个"是结束的,哪个是打开的,除了那些琐碎的情况之外,它是无法触及的。
编辑:正如Vasili的答案所示,有时可以这样做,但regex是解决这类问题的脆弱解决方案。
这样,您就可以将您的问题转换为琐碎的情况。由于您使用的是.NET,所以您可以简单地匹配每个引号字符串并使用接受匹配评估器的重载。。
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. 发布于 2014-01-13 22:07:39
从长远来看,与正则表达式不同,这样做的常规方法可能更易于维护:
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(" "));https://stackoverflow.com/questions/21102161
复制相似问题