假设我有以下字符串,我想在其上运行正则表达式:
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.
谢谢!
答案 0 :(得分:8)
您遇到与尝试匹配HTML或打开和关闭括号的人相同的问题,正则表达式只能匹配常规语言,并且知道哪个"
是关闭,而开放的语言是不可及的除了琐碎的案件之外别无其他。
话虽如此,你可以在琐碎的情况下转换你的问题。由于您使用的是.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)
答案 3 :(得分:1)
我将字符串拆分为一个字符串数组,使用引号“作为分隔符。 然后所有带有奇数索引的字符串将是一对引号中的字符串,仅在aSplittedString [oddIndex]上使用你的正则表达式,然后用“。
连接整个数组。答案 4 :(得分:1)
您需要做的是明确地只匹配拥有 -
的引号内的字符串。
使用此:
(\"[^"]*.*?)-(.*?\")
工作示例:http://regex101.com/r/jK5eL9
这里唯一的问题是它只适用于引号中word-word
的单个实例。如果你有,"word-word, and word-word"
它会失败。