2014-11-06 4 views
1

Я хочу удалить -L с конца моей строки если существуетRegex для удаления конкретной строки, если существует

Так

ABCD => ABCD 
ABCD-L => ABCD 

на данный момент я использую что-то вроде линии, ниже которой использует тип размещения if/else в моем Regex, однако у меня есть ощущение, что это должно быть проще, чем это.

var match = Regex.Match("...", @"(?(\S+-L$)\S+(?=-L)|\S+)"); 
+2

и метод 'string.Replace и string.Contains' не будет работать для вас ..? [String.Replace (строка, строка)] (http://msdn.microsoft.com/en-us/library/fk49wtc1 (v = vs.110).aspx) – MethodMan

+0

Это часть довольно большого Regex, который, если я хочу разбить его на код C#, он переведет на достаточное количество строк. Это все. – Mehrad

+2

еще раз зачем использовать регулярное выражение, если вы его не понимаете .. use string.Replace проще понять и включить string.Contains method – MethodMan

ответ

4

Как насчет делать:

Regex rgx = new Regex("-L$"); 
string result = rgx.Replace("ABCD-L", ""); 

Так в принципе: если строка заканчивается -L, замените эту часть с пустой строкой.

Если вы хотите не только вызвать замену в конце строки, но и в конце слова, вы можете добавить дополнительный переключатель для обнаружения границ слов (\b) в дополнение к концу строки :

Regex rgx = new Regex("-L(\b|$)"); 
string result = rgx.Replace("ABCD-L ABCD ABCD-L", ""); 

Обратите внимание, что обнаружение границ слов может быть немного неоднозначным. См. here для списка символов, которые считаются символами слова в C#.

+0

Does'Replace' работает только тогда, когда 'rgx.Sucess' является' true'? – Mehrad

+0

@Mehrad Что такое 'rgx.Sucess'? Невозможно найти это свойство где угодно. Во всяком случае, если ничего не согласовано, ничего не заменяется. –

+0

Вот и все, что я имел в виду. Очень полезно. Благодарю. Между тем, если вы походите на 'var matchL = Regex.Match (...);' вы получите свойство 'matchL', называемое' Sucess' типа 'bool', которое указывает, был ли результат для Regex совпадение. – Mehrad

1

Использование Regex.Replace функции,

Regex.Replace(string, @"(\S+?)-L(?=\s|$)", "$1") 

DEMO

Объяснение:

(      group and capture to \1: 
    \S+?      non-whitespace (all but \n, \r, \t, \f, 
          and " ") (1 or more times) 
)      end of \1 
-L      '-L' 
(?=      look ahead to see if there is: 
    \s      whitespace (\n, \r, \t, \f, and " ") 
|      OR 
    $      before an optional \n, and the end of 
          the string 
)      end of look-ahead 
1

Вы, конечно, можете использовать Regex для этого, но почему при использовании нормальной функции строки понятнее?

Сравните это:

text = text.EndsWith("-L") 
    ? text.Substring(0, text.Length - "-L".Length) 
    : text; 

к этому:

text = Regex.Replace(text, @"(\S+?)-L(?=\s|$)", "$1"); 

Или еще лучше, определить метод расширения, как это:

public static string RemoveIfEndsWith(this string text, string suffix) 
{ 
    return text.EndsWith(suffix) 
     ? text.Substring(0, text.Length - suffix.Length) 
     : text; 
} 

Тогда ваш код может выглядеть следующим образом:

text = text.RemoveIfEndsWith("-L"); 

Конечно, вы всегда можете определить метод расширения с помощью Regex. По крайней мере, ваш код вызова выглядит намного чище и гораздо читабельнее и удобнее.

+0

Ваше сравнение неверно. Вы должны сравнить свое решение с 'new Regex (« - L $ »). Заменить (текст,« »);' –

+0

@RobbyCornelissen - этот код, безусловно, лучше, чем Regex, который я использовал, но он все еще не так очевиден, как к тому, что он делает. – Enigmativity

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