2016-05-25 4 views
1

Прежде всего, я задал этот вопрос, и я нашел решение (по-видимому). Но я не могу заставить его работать. Так что мой вопрос более «Почему это так ...» более «Как сделать это ...»Как заменить шаблон с помощью Regex?

Я написал этот код:

private const string pattern = @"^[_L]{2}[0-9]{2}$"; 
public string RemoveL(string child) 
{ 
    Regex regex = new Regex(pattern); 
    return regex.Replace("SUB_1_SC_0310_1_A_L01", ""); 
} 

Этот код пытается удалить L_XX из любой строки. Итак:

SUB_1_SC_0310_1_A_L01 -> SUB_1_SC_0310_1_A

Но она возвращает ту же строку SUB_1_SC_0310_1_A_L01.

Любая идея о том, что я делаю неправильно?

+0

Вы пытаетесь удалить все после последнего подчеркивания (в том числе)? – mostruash

ответ

3

Это неправильный вариант, потому что вы использовали ^$, что означает start & end of string. Измените ваше регулярное выражение на [_L]{2}[0-9]{2}, и оно будет работать.

Обратите внимание, что вы можете использовать \d вместо [0-9] и [_L]{2} будет соответствовать любой комбинации _ и L, предпочитают _L вместо этого.

Я бы использовал _L\d{2}.

Кажется, что вы хотите сделать вторую цифру опциональной. У вас есть несколько вариантов:

  • _L\d\d? < = ? сделать второй разряд по желанию;
  • _L\d{1,2} < = {a,b} гарантировать, что предыдущий паттерн присутствует в количестве от a до b раз (включительно)
+0

Правда! благодаря! :) (будет повышаться, если разрешено). – Sonhja

+0

'[_L] {2}' будет совпадать: 'LL'' L_' и '__'. –

+0

@lbarros Я знаю, но у меня не было времени записать его;) –

1

Правая картина

private const string pattern = @"_L[0-9]{2}$"; 

Обратите внимание отсутствие ^ (строка не нуждается в начало с [_L]) и {2} после _L (вы хотите только "_L", не любое из {_, L} устанавливается дважды).

Объяснение:

_L  - exactly _L 
    [0-9]{2} - exactly 2 digits 0..9 
    $  - end of string 

Если вы хотите заменить "xxxxL_01" (пожалуйста, обратите внимание L и _ заказ), а затем

private const string pattern = @"[_L]{2}[0-9]{2}$"; 

Объяснение:

_L  - '_' and 'L' in any order (i.e. either _L or L_) 
    [0-9]{2} - exactly 2 digits 0..9 
    $  - end of string 
0

проблема в ваш шаблон - это символы '^' и '$', которые например, соответствуют началу и концу строки.Если вы удалите их, ваш шаблон будет соответствовать строке _L01, например, в любом месте строки.

так что ваш шаблон должен быть

private const string pattern = @"[_L]{2}[0-9]{2}"; 

Кроме того, если вы используете [_L] это означает, что один из элементов класса, состоящего из символов '_' и 'L'. Он будет соответствовать "_L", но также "__", "L_", или "LL". Если вы хотите быть более строгими и матчем только «_L» Ваш образец должен быть

private const string pattern = @"_L[0-9]{2}";