正则表达式匹配在任意位置连字的特定单词并分成两行

时间:2012-10-25 18:55:08

标签: regex multiline hyphenation hyphen

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

例如。匹配“连字符”:

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"

我希望一些比我更强的正则表达式可以提出一个正则表达式,其中明确包括被搜索的单词,即。我想在那里看到“连字号”。我还没有找到一种方法来编码如下的东西(无论如何都会有错误,因为它会匹配“hy-ted”):

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

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

3 个答案:

答案 0 :(得分:1)

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

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

  1. 从输入中删除连字符和换行符
  2. 使用.*hyphenated.*
  3. 匹配已清除的输入

    所有语言都可以轻松实现第1步,代码将更具可读性。

答案 1 :(得分: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

答案 2 :(得分: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"