正则表达式匹配任何单词后跟文字字符串

时间:2017-07-05 09:48:40

标签: regex tcl

所以我有以下内容:

^[a-zA-Z]+\b(myword+-)\b*

我认为会匹配

  • ^字符串开头
  • [a-zA-Z]任何字母字符
  • +一个或多个字符
  • \b后跟分词
  • (myword+-)后跟myword,其中可能包含一个或多个特殊字符
  • \b后跟分词
  • \*后面跟着任何内容

一:它不起作用 - 它与任何东西都不匹配

二:{myword+-)中包含的任何特殊字符都会引发错误

我可以逃脱特殊角色,但我事先并不知道它们可能是什么,所以我必须逃避所有可能性,或者我可能只是逃避{\m\y\w\o\r\d\\+\\-)

已编辑添加:

抱歉,我知道我应该提供更多信息

我有一系列字符串可以在表格中找到:

额外的android-sdk以及更多不感兴趣的内容 额外的android-ndk和更多没有兴趣的 额外的anjuta-extra和更多没有兴趣的 社区c ++ - gtk-utils和更多不感兴趣的

我有一个要在字符串中搜索的项目列表:

Android的SDK
Android的NDK
额外
c ++ - gtk-utils

如果字符串中的第二个单词与项目完全匹配,则该项目应该匹配,因此:

android-sdk将匹配第一个字符串
android-ndk将匹配第二个字符串
额外的wuill不匹配第三个字符串
c ++ - gtk-utils将匹配第四个字符串

所以(myword + - )是我要搜索的项目“可能包含一个或多个特殊字符”

感谢您的帮助

安德鲁

3 个答案:

答案 0 :(得分:0)

免责声明:由于您的问题缺乏预期输入和输出的信息,我将尝试告诉您为什么您的正则表达式根本不起作用。由于它不是一个完整的答案,您可能不希望将其标记为已接受,并且可能等待某人在您提供必要信息后立即向您提供工作解决方案的示例。

注意:

  • 量词字符(*, + 等)应用于文字字符或字符类(也就是字符组,即字符/范围内< strong> [] ) - 在你的正则表达式中,你写(myword+-)时,+符号应用的唯一内容就是字母&#39; d&#39;,没有别的。

  • 你的正则表达式中myword是什么?如果您想要一组字符,请使用 [] 结合字符范围和/或字符标记,例如\w(所有单词字符,例如字母和一些特殊字符)或{{1 (所有数字字符)

  • 你似乎也误解和误用了群体(&#34; \d &#34;),角色类(&#34; {{1 }} &#34;)和量词符号(&#34; ( ) &#34;)

答案 1 :(得分:0)

好的,在上面的帮助下我完成了它。

这个正则表达式正是我想要的,请记住我在tcl中工作(注意用来分隔搜索词的空格):

^ [a-zA-Z] + \ y extra \ y *

搜索词是“额外的”。

有必要转义搜索字符串中的任何字符,这些字符可能被正则表达式解释为限定符等,例如+

所以这也有效:

^ [a-zA-Z] + \ y dbus -c \ + \ + \ y *

安德鲁

答案 2 :(得分:0)

强烈建议:如果您想匹配文字字符串,请不要使用正则表达式。

如果我们有这个样本数据:

set strings {
    {extra android-sdk and more that is of no interest}
    {extra android-ndk and more that is of no interest}
    {extra anjuta-extra and more that is of no interest}
    {community c++-gtk-utils and more that is of no interest}
}

set search_strings {
    android-sdk
    android-ndk
    extra
    c++-gtk-utils
}

然后,为了在每个字符串的第二个单词中找到匹配项,我们只使用eq字符串相等运算符

foreach string $strings {
    foreach search $search_strings {
        if {[lindex [split $string] 1] eq $search} {
            puts "$search matches $string"
        }
    }
}

输出

android-sdk matches extra android-sdk and more that is of no interest
android-ndk matches extra android-ndk and more that is of no interest
c++-gtk-utils matches community c++-gtk-utils and more that is of no interest

如果您坚持使用正则表达式匹配,则可以转义任何特殊字符以消除其通常的正则表达式含义。在这里,我们采用暴力方法:任何非单词字符都会被转义,因此模式可能看起来像^\S+\s+c\+\+\-gtk\-utils

foreach string $strings {
    foreach search $search_strings {
        set pattern "^\\S+\\s+[regsub -all {\W} $search {\\&}]"
        if {[regexp $pattern $string]} {
            puts "$search matches $string"
        }
    }
}

我希望能够使正则表达式的部分成为文字字符串,例如

set pattern "^\\S+\\s+(***=$string)"
set pattern "^\\S+\\s+((?q)$string)"

但都失败了。

Tcl正则表达式记录在 https://www.tcl.tk/man/tcl8.6/TclCmd/re_syntax.htm

另请注意,您的模式^[a-zA-Z]+\b(myword+-)\b*不会在第一个和第二个单词之间提供任何空格。