Regex, который соответствует новой строке (\n) в С#
Хорошо, этот меня заводит...
У меня есть строка, которая формируется таким образом:
var newContent = string.Format("({0})\n{1}", stripped_content, reply)
newContent будет отображаться как:
(старый текст)
новый текст
Мне нужно регулярное выражение, которое удаляет текст между круглыми скобками с включенной скобкой AND символом новой строки.
Лучшее, что я могу придумать, это:
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
Ответы
Ответ 1
Если вы укажете RegexOptions.Multiline, вы можете использовать ^
и $
для соответствия началу и концу строки соответственно.
Если вы не хотите использовать эту опцию, помните, что новая строка может быть любой из следующих: \n
, \r
, \r\n
, поэтому вместо того, чтобы искать только \n
, вы возможно, используйте что-то вроде: [\n\r]+
, а точнее: (\n|\r|\r\n)
.
Ответ 2
На самом деле это работает, но с противоположным вариантом, т.е.
RegexOptions.Singleline
Ответ 3
Вероятно, у вас будет \r перед вашим \n. Попробуйте заменить \s на (\ r\n).
Ответ 4
Если вы пытаетесь совместить окончания строк, вы можете найти
Regex.Match("string", "regex", RegexOptions.Multiline)
помогает
Ответ 5
Думаю, что я немного опоздаю на вечеринку, но надеюсь, что это поможет.
Мне нужно было получить несколько токенов между двумя символами хеширования.
Пример i/p:
## token1 ##
## token2 ##
## token3_a
token3_b
token3_С##
В моем случае это работало:
var matches = Regex.Matches (mytext, "##(.*?)##", RegexOptions.Singleline);
Конечно, вы можете заменить двойные символы хэша на обоих концах своими собственными символами.
НТН.
Ответ 6
Как ни странно, вы можете использовать опции Multiline
и Singleline
.
Regex.Match(input, @"(.+)^(.*)", RegexOptions.Multiline | RegexOptions.Singleline)
Первая группа захвата будет содержать первую строку (включая \r
и \n
), а вторая группа будет иметь вторую строку.
Почему:
Multiline
:
^
и $
соответствуют началу и концу каждой строки (вместо начала и конца входной строки).
Singleline
:
Точка (.
) соответствует каждому символу (вместо каждого символа, кроме \n
)
см документы