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

Posted

技术标签:

【中文标题】正则表达式匹配在任意位置连字符并分成两行的特定单词【英文标题】:regex to match specific words hyphenated at arbitrary positions and split across two lines 【发布时间】:2012-10-16 00:48:24 【问题描述】:

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

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

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:hyphenatedhyphen/linebreaksuffix-of:hyphenated"

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

【问题讨论】:

【参考方案1】:

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

[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

【讨论】:

这几乎不比 OP 的努力好。我认为我们正在寻找更复杂的东西。【参考方案2】:

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

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

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

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

【讨论】:

这仍然与 OP 的要求发生冲突,即不能对输入进行预处理,尽管我现在无法想象在什么上下文中您可以与正则表达式匹配,但无法进行预处理输入文本。【参考方案3】:

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

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"

【讨论】:

以上是关于正则表达式匹配在任意位置连字符并分成两行的特定单词的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

如何使用正则表达式

正则表达式:\B 匹配不是单词开头或结束的位置

正则表达式——06位置匹配

Notepad++正则表达式

python与正则表达式