【问题标题】:C# greedy regular expression including match textC#贪婪正则表达式包括匹配文本
【发布时间】:2016-12-14 19:32:20
【问题描述】:

我目前有字符串:

"CL,UP_REMOVE_LINE,#global_session_id,arg_stage=false,arg_project_id=-1,#global_line_id,arg_activity_id=-1,arg_mode=1,arg_line_id=#global_line_id,arg_session_id=-1"

我试过了:

splitty = Regex.Split(lineText,@"[\,]+\s*(?>arg_){1}?");

并收到:

{string[7]}
    [0]: "CL,UP_REMOVE_LINE,#global_session_id"
    [1]: "stage=false"
    [2]: "project_id=-1,#global_line_id"
    [3]: "activity_id=-1"
    [4]: "mode=1"
    [5]: "line_id=#global_line_id"
    [6]: "session_id=-1"

我至少用一个逗号分隔,后跟任意空格,后跟“arg_”分隔符,但有没有办法保持“arg_”部分完整,即索引​​ [1-6]?

【问题讨论】:

    标签: c# .net regex regex-greedy


    【解决方案1】:

    使用正向前瞻(检查是否存在,但不消耗,因此将其留在拆分块中)而不是原子组(仍在消耗,因此在使用 Split 时被删除):

    ,+\s*(?=arg_)
    

    regex demo

    请注意,您不需要将逗号放入字符类中,也不需要转义逗号。

    另外,{1}? = {1} 是完全多余的(您可以随时删除它,因为始终隐含此 {1}(即 abc = a{1}b{1}c{1}))。

    【讨论】:

    • 完美,谢谢。所以我的贪婪解决方案不起作用,因为它消耗了它匹配的东西。我对来自 msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx 的“非回溯(或“贪婪”)子表达式”条目处于相反的假设,其中 [13579](?>A+B+) 在“1ABB 3ABBC”中产生“1ABB”、“3ABB”和“5AB” 5AB 5AC”。你能解释一下为什么贪心解决方案似乎与我们当前的假设相反吗?
    • 原子组仅“关闭”回溯到子表达式,它们仍然匹配并消耗文本,而环视不消耗字符,它们只检查当前之前或之后是否存在某些文本定位而不移动索引。请参阅Mastering Lookahead and Lookbehind在前瞻或后瞻结束时,正则表达式引擎没有在字符串上移动。您可以在第一个之后再链接三个前瞻,而正则表达式引擎仍然不会移动。
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多