检查\ w {1,4}是否还包含带正则表达式的破折号

时间:2017-06-28 09:37:51

标签: c# regex

我正在尝试将字符串(test_one)与正则表达式匹配。 我将这两个分成不同的组:

\b(\w{1,4})_(\w*)

第一组可以在1到4之间(字母字符)长度并且可以包含连字符(并非总是),但\ w仅涵盖[a-zA-Z0-9_],所以如果我尝试这样:

\b([a-zA-Z0-9-]{1,4})_(\w*)

并输入一个连字符:“tes-t_one”它找到匹配,但完全匹配只是:-t_one。

当连字符在字符串中时,如何在整个第一组上获得匹配?

预期输出应匹配,例如test_one或tes-t_one。不是-test_one或test-_one

1 个答案:

答案 0 :(得分:1)

似乎conditional construct会对您有所帮助:如果在单词边界之后和t之前的字母数字符号之间只有一个连字符,则匹配_个字符,否则匹配{ {1}}第一组中的字母数字或{1,5}字符。

{1,4}

请参阅regex demo

<强>详情:

  • - - 字边界
  • \b((?([^\W_]+-[^\W_]+_)[-\w-[_]]{1,5}|[^\W_]{1,4}))_([^\W_]*) - 第1组:
    • \b - if ...
    • ((?([^\W_]+-[^\W_]+_)[-\w-[_]]{1,5}|[^\W_]{1,4})) - 有一系列的:
      • (? - 一个或多个字母数字
      • ([^\W_]+-[^\W_]+_) - 连字符
      • [^\W_]+ - 一个或多个字母数字
      • - - 下划线
    • [^\W_]+ - 1到5个字母数字或_符号
    • [-\w-[_]]{1,5} - 其他
    • - - 匹配1到4个字母数字
  • | - 下划线
  • [^\W_]{1,4}) - 0+字母数字(字母或数字)。

要使模式仅匹配ASCII,请将_选项传递给正则表达式构造函数。

请注意,([^\W_]*)等于RegexOptions.ECMAScript匹配任何字母或数字(从[^\W_]模式中减去[\w-[_]])。