Обработка строк в C # по правилам с использованием регулярных выражений - PullRequest
1 голос
/ 27 октября 2011

У меня ситуация ..
Имея строку, которая может содержать цифры, буквы и некоторые символы, я хочу сделать из нее извлечение или сделать некоторые замены на основе некоторых «правил». Я считаю, что лучше всего привести несколько примеров возможных ситуаций и того, что я хочу сделать (показать):

String           Display1   or  Display2

AB_X345           X345         or  ###X345  
AB_1234            1234        or  ###1234  
X987_TEXT_4567    X9874567     or  X987######4567  
X987TEXT4567      X9874567     or  X987####4567  
X798TEXT          X798         or  X798####  
789TEXT            789         or  789####  
X400              X400         or  X400   

Таким образом, практически, когда я нахожу X и цифры, я хочу их отобразить. Если появляется какой-то текст, я не хочу, чтобы он отображался, или я хочу, чтобы он маскировался символом (#). Если X отсутствует, я хочу отображать только цифры. Является ли Regex самым простым способом сделать это? (Я не знаком с регулярным выражением - только с высоты птичьего полета). Можно ли собрать все правила в одном выражении регулярного выражения или это сложно?

Спасибо за любые предложения

Ответы [ 4 ]

2 голосов
/ 27 октября 2011

Это просто:

resultString = Regex.Replace(subjectString, 
    @"\D       # Match a non-digit character
    (?<!       # unless...
     X         #  it's an X
     (?=\d)    #  which is followed by a digit.
    )          # End of lookbehind", 
    "", RegexOptions.IgnorePatternWhitespace);

Измените последнюю строку на

    "#", RegexOptions.IgnorePatternWhitespace);

, чтобы маскировать символы с помощью # вместо их удаления.

1 голос
/ 27 октября 2011

Попробуйте это регулярное выражение:

X\d|\d

ИЛИ

/X\d|\d/g

Выбираются только цифры или цифры начинаются с 'X'

1 голос
/ 27 октября 2011

Попробуйте это для Дисплея 1: @"(?<![A-Za-z])X[0-9]+|[0-9]+"

var rx = new Regex(@"(?<![A-Za-z])X[0-9]+|[0-9]+");
var matches = rx.Matches("X987_TEXT_4567");

var result = "";

foreach (Match match in matches)
{
    result += match.Value;
}

Под C # 4.0 вы даже можете сделать

var rx = new Regex(@"(?<![A-Za-z])(?<1>X[0-9]+)?(?:(?:[^0-9]*)(?<1>[0-9]+))*");
var match = rx.Match("X987_TEXT_4567_123");
var res = string.Concat(match.Groups[1].Captures.OfType<Capture>().Select(p => p.Value));

Но регулярное выражение в этой точке становится немного нечитаемым: -)

0 голосов
/ 27 октября 2011

Попробуйте, проверьте приведенный ниже пример и проверьте его.

\d?X[0-9]+|[0-9]

Пример:
http://rubular.com/r/cA5Y49pCtV

...