4

我希望在文本文件中搜索给定的单词,该单词可以选择在单词中的未知位置连字符并拆分为连续的行。

例如。匹配“连字符”内:

This sentence contains a hyphena-
ted word.

最接近(没有吸引力)的解决方案:

"h\(-\s*\n\s*\)\?y\(-\s*\n\s*\)\?p\(-\s*\n\s*\)\?h\(-\s*\n\s*\)\?e\(-\s*\n\s*\)\?n\(-\s*\n\s*\)\?a\(-\s*\n\s*\)\?t\(-\s*\n\s*\)\?e\(-\s*\n\s*\)\?d"

我希望一些比我强的 regex-foo 可以提出一个明确包含正在搜索的单词的正则表达式,即。我想在那里看到“连字符”。我还没有找到一种编码类似以下内容的方法(无论如何这都是错误的,因为它会匹配“hy-ted”):

"{prefix-of:hyphenated}{hyphen/linebreak}{suffix-of:hyphenated}"

我意识到预处理文档以折叠这些单词会使搜索更简单,但我正在寻找一个正则表达式,我可以在由于所涉及的工具而无法实现的上下文中使用它。

4

3 回答 3

1

考虑到这hy-phen-ated也应该匹配,我认为这是一个单独的正则表达式不是正确方法的情况。

我会这样做(不知道你的语言,我使用了伪代码):

  1. 从输入中删除连字符和换行符
  2. 将清理后的输入与.*hyphenated.*

所有语言都可以轻松实现第 1 步,并且代码的可读性会更高。

于 2012-10-25T19:22:38.310 回答
0

我认为这会奏效。如果您有很多词要搜索,您可能需要创建一个脚本来为您生成搜索模式。

[h\-]+\s*[y\-\s]+[p\-\s]+[h\-\s]+[e\-\s]+[n\-\s]+[a\-\s]+[t\-\s]+[e\-\s]+d\b

我认为您没有提到您使用的是哪种语言,但我使用 .Net 对此进行了测试。

这是一个简单的 python 脚本,它将生成搜索模式:

# patterngen.py
# Usage:  python patterngen.py <word>
# Example:  python patterngen.py hyphenated

word = sys.argv[1]
pattern = '[' + word[0] + r'\-]+\s*'

for i in range(1,len(word)-1):
    pattern = pattern + r'[' + word[i]
    pattern = pattern + r'\-\s]+'

pattern = pattern + word[-1] + r'\b'
print pattern
于 2012-10-25T19:17:16.047 回答
0

另一种处理这个问题的方法,就在蝙蝠的右边,是像这样“滑动”连字符:

hyphenated|h(-\s*\n\s*)yphenated|hy(-\s*\n\s*)phenated|hyp(-\s*\n\s*)henated|hyph(-\s*\n\s*)enated|hyphe(-\s*\n\s*)nated|hyphen(-\s*\n\s*)ated|hyphena(-\s*\n\s*)ted|hyphenat(-\s*\n\s*)ed|hyphenate(-\s*\n\s*)d

读起来更好,但我真的不知道这对您的原始模式有何表现。


另一个想法是首先使用以下模式来缩小搜索范围:

h[hypenatd]{0,9}(-\s*\n*\s)?[hypenatd]{0,9}

然后在这个结果中匹配。

事实上,如果我没记错的话,如果你匹配这样的组:

(h[hypenatd]{0,9})(?:-\s*\n*\s)?([hypenatd]{0,9})

那么单词hyphenated的出现是所有匹配项,其中伪代码:

(match.group1 + match.group2) == "hyphenated"
于 2012-10-25T19:39:46.593 回答