简体   繁体   中英

Regex that matches a newline (\n) in C#

OK, this one is driving me nuts.... I have a string that is formed thus:

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

newContent will display like:
(old text)
new text

I need a regular expression that strips away the text between parentheses with the parenthesis included AND the newline character.

The best I can come up with is:

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

This works, but I want specifically to match the newline ( \\n ), not any whitespace ( \\s ) Replacing \\s with \\n \\\\n or \\\\\\n does NOT work.

Please help me hold on to my sanity!

EDIT: an example:

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

If you specify RegexOptions.Multiline then you can use ^ and $ to match the start and end of a line, respectively.

If you don't wish to use this option, remember that a new line may be any one of the following: \\n , \\r , \\r\\n , so instead of looking only for \\n , you should perhaps use something like: [\\n\\r]+ , or more exactly: (\\n|\\r|\\r\\n) .

实际上它可以工作,但选项相反

 RegexOptions.Singleline

You are probably going to have a \\r before your \\n. Try replacing the \\s with (\\r\\n).

If you're trying to match line endings then you may find

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

helps

Think I may be a bit late to the party, but still hope this helps.

I needed to get multiple tokens between two hash signs.

Example i/p:

## token1 ##
## token2 ##
## token3_a
token3_b
token3_c ##

This seemed to work in my case:

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

Of course, you may want to replace the double hash signs at both ends with your own chars.

HTH.

Counter-intuitive as it is, you could use both Multiline and Singleline option.

Regex.Match(input, @"(.+)^(.*)", RegexOptions.Multiline | RegexOptions.Singleline)

First capturing group will contain first line (including \\r and \\n ) and second group will have second line.

Why:

  • Multiline :

    ^ and $ match the beginning and end of each line (instead of the beginning and end of the input string).

  • Singleline :

    The period ( . ) matches every character (instead of every character except \\n )

    see docs

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM