【发布时间】:2012-07-31 08:49:41
【问题描述】:
我正在动态编辑一个正则表达式以匹配 pdf 中的文本,它可以在某些行的末尾包含连字符。
例子:
源字符串:
"consecuti?vely"
替换规则:
.Replace("cuti?",@"cuti?(-\s+)?")
.Replace("con",@"con(-\s+)?")
.Replace("consecu",@"consecu(-\s+)?")
期望的输出:
"con(-\s+)?secu(-\s+)?ti?(-\s+)?vely"
替换规则是动态构建的,这只是一个导致问题的例子。
执行这种多重替换的最佳解决方案是什么,这将产生所需的输出?
到目前为止,我考虑过使用 Regex.Replace 并压缩单词以替换为可选 (-\s+)?在每个字符之间,但这不起作用,因为要替换的单词在正则表达式上下文中已经包含特殊含义的字符。
编辑:我当前的代码,当替换规则重叠时不起作用,如上例所示
private string ModifyRegexToAcceptHyphensOfCurrentPage(string regex, int searchedPage)
{
var originalTextOfThePage = mPagesNotModified[searchedPage];
var hyphenatedParts = Regex.Matches(originalTextOfThePage, @"\w+\-\s");
for (int i = 0; i < hyphenatedParts.Count; i++)
{
var partBeforeHyphen = String.Concat(hyphenatedParts[i].Value.TakeWhile(c => c != '-'));
regex = regex.Replace(partBeforeHyphen, partBeforeHyphen + @"(-\s+)?");
}
return regex;
}
【问题讨论】:
-
我很难从您的示例中看到一组明确的规则。我假设这种连字符可以发生在任何字符串上,因此,您显示的示例仅特定于该字符串。您需要提供更多关于如何构建正则表达式的一般规则。
-
这是本示例的最终规则集。我扫描 pdf 页面以查找模式 word-hyphen-newline 并获取所有带连字符的字符串。在这种情况下,它只产生了上面的 3 条规则。
-
抱歉,您所说的与您的示例不符 1)
?不是连字符,2) 没有新行。那么你是说每个单独的字符串都有特定的规则吗? -
我会将我当前的代码放在问题中。这适用于替换规则不重叠的所有情况。