提问者:小点点

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


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

例如,在以下内容中匹配“连字符”:

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能想出一个regex,它清楚地包含了正在搜索的单词,也就是说,我想在里面看到“连字符”。我还没有找到一种编码如下内容的方法(无论如何这都是错误的,因为它会匹配“hy-ted”):

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

我意识到预处理文档折叠这样的话会使搜索更简单,但我正在寻找一个正则表达式,我可以在上下文中使用,由于涉及的工具,这是不可能的。


共3个答案

匿名用户

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

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

  1. 从输入中删除连字符和换行符
  2. 匹配清洁输入与.*断字。*

所有语言都可以实现步骤1。这样,代码的可读性就会大大提高。

匿名用户

我想这会管用的。如果有很多单词要搜索,您可能需要创建一个脚本来生成搜索模式。

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

我想你没有提到你在使用哪种语言,但是我用它测试了一下。网。

下面是一个简单的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

匿名用户

另一种方法是在bat的右边“滑动”连字符,如下所示:

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})

然后,单词连字符的出现是所有匹配项,其中,伪密码:

(match.group1 + match.group2) == "hyphenated"