2013-05-13 3 views
0

Я создаю регулярное выражение для многострочного шаблона строки, но это не работает. это мой шаблон ввода.Regex for multiline string pattern

FXP/R, U

1.NWAMNKPA/UGONMA D 2.NWAMNKPA/AMAJINDI О
3.NWAMNKPA/AMAJINDI Н.А. 4.NWAMNKPA/ADAUGOAMAJI С
5.NWAMNKPA/CHINAZAEKPERE N

Регулярное выражение:

(FXP \ S {3,20}) | (.. \ г \ с {3} \ S + (+))

но не принимать эту строку:

3.NWAMNKPA/AMAJINDI NA 4.NWAMNKPA/ADAUGOAMAJI C

это займет всего это два только:

1.NWAMNKPA/UGONMA D 2.NWAMNKPA/AMAJINDI O
5.NWAMNKPA/CHINAZAEKPERE N

Желаемый о/р: -

  1. NWAMNKPA/UGONMA D
  2. NWAMNKPA/AMAJINDI О
  3. NWAMNKPA/AMAJINDI Н.А.
  4. NWAMNKPA/ADAUGOAMAJI С
  5. NWAMNKPA/CHINAZAEKPERE N
+0

Работа в соответствии с указаниями. Пока вы не скажете, какой у вас желаемый результат, здесь нет никаких вопросов. – spender

+0

@spender - я указал желаемый о/р. –

ответ

0

Вы можете посмотреть RegexOptions.MultiLine (и другие o ptions). (http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx)

Я бы посоветовал вместо этого использовать String.Split() и проверить линию за раз. Регулярные выражения жестко читаемы, и нет необходимости сопоставлять шаблон по более строгим. Это упрощает понимание кода.

0

Я не думаю, что ваше регулярное выражение делает то, что вы думаете, что оно делает. Первая часть в порядке, но вторая часть, \r\s{3}.\S+(.+), ищет возврат каретки, за которым следуют ровно три пробельных символа, за которыми следует любой символ (пробел или нет), за которым следует любое количество символов без пробелов, за которыми следует любое количество символов, которые вы снимаете.

С этим связано множество проблем. Прежде всего, не весь текст имеет возврат каретки (\r) - проверка на новую строку (\n) вместо этого намного безопаснее. Даже если у вашего текста есть \r, почти наверняка будет \n (оконцы заканчиваются линиями с \r\n). \n может быть погружен в \s{3}, в зависимости от ваших данных.

Во-вторых, + является жадным оператором.Это означает, что первый + в \S+(.+) будет соответствовать всему, что он может - другими словами, все символы без пробелов, пока они не достигнут пробела. Только после найти пробел будет (.+) начать захват, и первый символ, который он имеет, будет пробелом. В качестве альтернативы, если в строке нет пробелов, \S+ «вернет» один символ, так что .+ будет иметь что-то, чтобы соответствовать, и в этом случае он будет просто последним символом строки.

все обстоятельства, я думаю, что вы собираетесь быть гораздо лучше с чем-то простым, как это:

RegEx.Split(myData, @"(?=\d)").Where(s => !string.IsNullOrEmpty(s)) 

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

+0

Когда я храню o/p RegEx.Split (myData, @ "(? = \ D)") в массиве строк. он создает некоторые индексы для пробелов, поэтому я использую регулярное выражение. –

+0

@AnuragJain - Отредактировано, чтобы отфильтровать пустые строки. – Bobson