当前位置: 首页 > 知识库问答 >
问题:

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

华建同
2023-03-14

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

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

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个答案

傅增
2023-03-14

另一种方法是在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"
贺兴平
2023-03-14

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

[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
邰德业
2023-03-14

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

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

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

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

 类似资料:
  • 我需要regexp来匹配数字与字符串中的特定索引,该字符串只包含一个数字。字符串包含10位数字和随机位置的随机数空格。 需要在2,3,7,8,9位置匹配数字并用'Q'替换。 要匹配的示例: 所需的结果:

  • 我在ASP.NET应用程序中有一个textbox,我需要使用正则表达式来验证用户输入字符串。要求字符串的连字符总数只能为一个。 匹配项: null 测试--您好 -测试- 测试-您好--

  • Perl6正则表达式匹配连接 它为False,因为连词中的“23”与$a中的“23”子字符串匹配,但此子字符串与连词中的“ef”不匹配。这有点违反直觉,因为它更容易解释$a ~~ m/23 如果我有n个正则表达式,我想看看是否所有这些n个正则表达式都匹配相同的整个字符串,而不是匹配整个字符串的相同子字符串部分,那么编写perl6表达式的最佳方法是什么? 在例子中,我真的想做 如果正则表达式的数量很

  • 问题内容: 我想搭配以下 com.my.company。 moduleA .MyClassName com.my.company。 moduleB .MyClassName com.my.company。 anythingElse .MyClassName 但 不是 以下 com.my.company。 核心 .MyClassName 我当前的简单正则表达式模式是: 因此,基本上,我该如何匹配其他

  • 我想匹配单词的一部分,如果模式中单词的长度小于我匹配的字符串,则可以匹配,例如: 输出为true。但是,如果单词长度较大,则返回false,例如: 那么,我怎样才能只匹配单词的一部分呢?

  • 问题内容: 我有以下字符串: 如您所见,该字符串由#分隔。我的用例类似于一个简单的SPLIT(string,“#”)操作,但是regex给了我更多的灵活性。 我想匹配两次出现的#之间的字符。例如,第二次和第三次出现之间的字符应匹配:“ US” 我使用的是Google Bigquery,能够匹配字符串的前两个术语,但与第三个术语比较费劲: 位置是字符串,例如上面的字符串。 我已经找到了这个问题,但是

  • 本文向大家介绍python正则表达式匹配[]中间为任意字符的实例,包括了python正则表达式匹配[]中间为任意字符的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇python正则表达式匹配[]中间为任意字符的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 我需要有关正则表达式的帮助:我正在尝试检查一个句子是否包含特定单词。 让我们以这个主题的标题为例: “正则表达式以查找字符串中的特定单词” 我需要查找它是否包含 if ,在这种情况下它是错误的。 我无法使用包含的方法,因为在这种情况下它将返回true( 如果为 * ic, 则为 spec * ) 我当时在考虑使用方法匹配,但我有点正则表达式。 基本上,匹配方法输入中的正则表达式需要指定