2016-08-08 8 views
1

В настоящее время я строка:C# жадный регулярное выражение, включая текст матча

"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]?

ответ

1

Используйте положительный предпросмотр (проверить наличие, но не потребляют, тем самым оставляя его в расщепленных кусков) вместо атомной группы (которая по-прежнему потребляется, и, таким образом, удаляется при использовании Split):

,+\s*(?=arg_) 

См regex demo

Примечание Вам не нужно ставить запятую в класс символов, и вам не нужно бежать запятой.

enter image description here

Кроме того, {1}? = {1} и полностью избыточными (Вы всегда можете удалить его, так как это {1} всегда подразумевается (т.е. abc = a{1}b{1}c{1})).

+0

Perfect, спасибо. Поэтому мое жадное решение не будет работать, потому что оно потребляет то, что соответствует. Я был в противоположном предположении, что запись «Небезопасная запись» (или «жадное») подвыражение с https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx, где [13579] (?> A + B +) дает «1ABB», «3ABB» и «5AB» в «1ABB 3ABBC 5AB 5AC». Можете ли вы объяснить в этом случае, почему жадное решение, похоже, делает противоположное нашему нынешнему предположению? – Rice

+1

Атомные группы только «отключают» возврат в подвыражение, они по-прежнему соответствуют и потребляют текст, в то время как начертания не потребляют символы, они проверяют наличие или отсутствие какого-либо текста до или после текущей позиции * без * перемещения индекса , См. [* Освоение Lookahead и Lookbehind *] (http://www.rexegg.com/regex-lookarounds.html): * Это означает, что в конце просмотра или lookbehind механизм регулярных выражений не перемещался по строка. Вы можете связать еще три раза после первого, и механизм регулярных выражений по-прежнему не будет двигаться. * –

Смежные вопросы