我正在尝试将字符串(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
答案 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-[_]]
)。