定界字符串正则表达式排除引号内的匹配

时间:2017-05-10 19:27:09

标签: c# regex

我的字符串包含$ OR $$符号之间的单词。如果这些分隔的单词不被单引号括起来,我必须用其他单词替换这些单词。

示例:

原始字符串:
$ quick $ brown '$$ fox $$'跳过 $$超过$$ '$ lazy $'

替换后的字符串应为:
替换布朗'$$ fox $$'替换 '$ lazy $'

到目前为止,我已经提出了正则表达式

\$[^$]+\$|\${2}[^$]+\${2}

这匹配字符串中的所有模式,而不管单引号。我怎样才能忽略单引号中的内容?

2 个答案:

答案 0 :(得分:1)

您可以使用这样的外观。

正则表达式: (?<=\s)([$]{1,2})[^\$]*\1(?=\s)

说明:

(?<=\s)whitespace的正面观察,用于检查前一个字符是否为空格。如果'存在,那么它就不会匹配。

([$]{1,2})[^\$]*\1匹配$$$之间的字词。

([$]{1,2})捕获$$$并使用捕获组\1在单词结尾处第二次匹配。

[^\$]*匹配word,直到找到$

(?=\s)检查单词后是否存在空格。

替换替换为您想要的任何字词。

<强> Regex101 Demo

更新:对于下面的单词出现在开头或结尾的情况。

  <$> $ Hello $ $ quick $ brown&#39; $$ fox $$&#39;跳过$$超过$ $懒惰$&#39;狗$ Hello $

使用此正则表达式。

正则表达式: (?:(?<=\s)|(?<=^))([$]{1,2})[^\$]*\1(?=\s|$)

(?:(?<=\s)|(?<=^))关注whitespacebeginning of string.

(?=\s|$)展望whitespaceend of string.

<强> Regex101 Demo

答案 1 :(得分:1)

跳过某些内容的最常见方法是匹配并捕获它(以便稍后恢复该值)并匹配您不需要的内容。

请参阅C# demos代表输入字符串p代表模式m代表< EM>匹配):

using System;
using System.Text.RegularExpressions;
using System.Linq;

public class Test
{
    public static void Main()
    {
        var s = "The $quick$ brown '$$fox$$' jumps $$over$$ the '$lazy$' dog";
        var p = @"(?x)
                (?<quote>'[^'\\]*(?:\\.[^\\']*)*') # A single quoted string literal pattern
                 |                                 # or
                (?<!\$)              # no $ immediately to the left
                    (\${1,2})        # 1 or 2 $ symbols (Group 1)
                       [^$]+         # 1 or more non-$ chars
                    \1               # Same value as in Group 1 (backreference)
                (?!\$)               # No $ immediately to the left of the current location
              ";            
        var result = Regex.Replace(s, p, m =>
            m.Groups["quote"].Success ? m.Groups["quote"].Value : "substituted");
        Console.WriteLine(result);
        // => The substituted brown '$$fox$$' jumps substituted the '$lazy$' dog
    }
}

正则表达式基本匹配'...'子字符串,将它们放入quote命名组,然后第二部分仅匹配$...$$$...$$子字符串。 Regex.Replace(s, p, m => m.Groups["quote"].Success ? m.Groups["quote"].Value : "substituted")检查quote组是否参与了匹配,如果是,则只需将该文本重新插入结果中。否则,就会发生替代。