如何编写一个匹配所有不是'$'后跟'i'或'{'的字符的正则表达式?

时间:2010-10-24 00:20:35

标签: regex scala parser-combinators

意思是,我想匹配:

$10

$

但不是这样:

${name}

或:

$image{http://wrfgadgadga.com/gadgad.png}

我也希望匹配其他所有内容......普通字符,符号,数字等。

匹配所有内容,但以$开头的内容很容易。就像这样:

def literalCharacter: Parser[String] = """[^\$]""".r

我已经尝试过使用(?!i)或(?!{)多种组合的正则表达式前瞻语法,但我似乎无法让它工作。我也试过用=代替它来重写它!像这样:(?= i)

基本上,我已经尝试用我可以用[^ \ $]表达式进行成像的各种方式注入这些预测,但我无法使其工作。

帮助?

编辑:嗯,这似乎有效:

[^\$]|\$(?!i)|\$(?!\{)

1 个答案:

答案 0 :(得分:3)

您的内容无法正确匹配x$等字符串。如果要匹配整个字符串,请尝试

"""^\$$|^[^\$].*$|^\$[^i\{].*$"""

我们匹配由|分隔的三个序列中的任何一个:

^\$$
^[^\$]+.*$
^\$[^i\{]+.*$

让我们把它分开:

// First pattern--match lone '$' character
^   // Matches start of string
\$  // Matches the literal character '$'
$   // Matches end of string

// Second pattern--match a string starting with a character other than '$'
^       // Start of string
[^\$]+  // Match at least one non-'$':    
           +   // Match one or more
      [^  ]    // ...of characters NOT listed...
        \$     // ...namely, a literal '$'
.*      // Any number of other characters
$       // End of the string

// Third pattern--match a string starting with '$' but not '$i' or '${'
^        // Start of string
\$       // The literal character '$'
[^i\{]+  // Match at least one non-'i'/non-'{'
.*       // Any number of other characters
$        // End of the string

如果您不匹配整个字符串,则必须担心foo$image{Hi}之类的问题。如果您还想匹配空字符串,请在匹配前添加^$|

请注意,这是专门针对正则表达式编写的,而不是考虑到解析器组合。根据您拥有的其他规则,您可能想要也可能不想匹配整个字符串。