2009-07-23 4 views
24

OK, это один сводит меня с ума .... У меня есть строка, которая формируется таким образом:Regex, который соответствует новой строки ( п) в C#

var newContent = string.Format("({0})\n{1}", stripped_content, reply) 

newContent будет отображаться как:
(старый текст)
новый текст

Мне нужно регулярное выражение, которое удаляет текст между круглыми скобками с включенной скобкой И символ новой строки.

Лучшее, что я могу придумать это:

const string regex = @"^(\(.*\)\s)?(?<capture>.*)"; 
var match= Regex.Match(original_content, regex); 
var stripped_content = match.Groups["capture"].Value; 

Это работает, но я хочу специально, чтобы соответствовать новой строки (\n), а не какой-либо пробел (\s) Замена \s с \n\\n или \\\n делает Не работа.

Пожалуйста, помогите мне держаться за мое здравомыслие!

EDIT: пример:

public string Reply(string old,string neww) 
     { 
      const string regex = @"^(\(.*\)\s)?(?<capture>.*)"; 
      var match= Regex.Match(old, regex); 
      var stripped_content = match.Groups["capture"].Value; 
      var result= string.Format("({0})\n{1}", stripped_content, neww); 
      return result; 
     } 

Reply("(messageOne)\nmessageTwo","messageThree") returns : 
(messageTwo) 
messageThree 
+0

Не могли бы вы опубликовать краткую, но полную программу, которая демонстрирует проблему? Сейчас мне сложно собраться вместе. –

ответ

54

Если вы укажете RegexOptions.Multiline, вы можете использовать ^ и $ в соответствии с началом и концом строки, соответственно.

Если вы не хотите использовать эту опцию, помните, что новая линия может быть одним из следующих: \n, \r, \r\n, поэтому вместо того, чтобы искать только \n, вы, возможно, следует использовать что-то вроде: [\n\r]+ , а точнее: (\n|\r|\r\n).

+17

Не забывайте, что чередование не жадно; если вы примените ваше регулярное выражение к '' \ r \ n "', оно будет соответствовать только '' \ r "'. Вместо этого я использовал бы '(\ n | \ r \ n?)' Или, может быть, '(\ r \ n? \\ n)'. –

+0

Я не мог заставить его работать с опцией Multiline. (\ n | \ r | \ r \ n) сделал трюк. Оказалось, что в этом конкретном случае \ r \ n необходимо было получить соответствие, хотя я вставлял только \ n в строку, которая должна быть сопоставлена. – Dabblernl

+0

@AlanMoore спасибо за это. Я был смущен, почему '\ r \ n' совпадал дважды. – ToastyMallows

3

Если вы пытаетесь соответствовать окончаний строк, то вы можете найти

Regex.Match("string", "regex", RegexOptions.Multiline) 

помогает

+1

извините, что не работает – Dabblernl

4

Вы, вероятно, будет иметь \ г перед вашим \ n. Попробуйте заменить \ s на (\ r \ n).

15

Acctually он работает, но с противоположной опцией, т.е.

RegexOptions.Singleline 

:-)

+1

приятно! это исправило это для меня! так или иначе, окончание строк игнорируется с использованием многострочной опции. но с одной линией сделал это! +1 – Yustme

+0

Спасибо за это предложение, многострочный ввод обрабатывается просто отлично в режиме «Singleline» ... но поведение отличается, и иногда поведение «Singleline» - это то, что вам нужно! я знал, что мой ввод был многострочным, поэтому я, не задумываясь об этом, задал параметр «Многострочный» ... но в этом случае '.' (точка) не соответствует символу новой строки, который был тем, что я действительно разыскивается. Установка в 'Singleline' исправила эту проблему. '$' в этом случае соответствует концу входной строки, что также удобно. Итак, извлеченный урок: многострочный ввод не всегда означает, что нужно использовать опцию «Multiline»! – TCC

+0

Я не знаю, хотел ли это OP или нет, но это то, что я хотел! То есть для поиска текста для моего регулярного выражения и, фактически, игнорирования строк. Благодарю. – glaucon

3

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

Мне нужно было получить несколько токенов между двумя символами хэша.

Пример я/р:

## token1 ##
## token2 ##
## token3_a
token3_b
token3_C##

Это, казалось, работать в моем случае:

var matches = Regex.Matches (mytext, "##(.*?)##", RegexOptions.Singleline);

Конечно, вы можете заменить двойные символы хэша на обоих концах своими собственными символами.

HTH.

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