我希望在文本文件中搜索给定单词,该单词可以选择在单词中的未知位置连字,并分成连续的行。
例如。匹配“连字符”:
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}"
我意识到预处理文档以折叠这些单词会使搜索变得更简单,但我正在寻找一个正则表达式,我可以在上下文中使用,因为涉及的工具无法实现。
答案 0 :(得分:1)
考虑到hy-phen-ated
也应该匹配,我认为这是一个单独使用正则表达式 的情况。
我会这样做(不知道你的语言,我使用了伪代码):
.*hyphenated.*
所有语言都可以轻松实现第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"