C#文件gettext-string正则表达式解析器

时间:2011-12-01 11:50:45

标签: c# .net regex gettext

简短问题

让我们有一个正则表达式,它读取双引号内的字符串。该字符串仅在内部没有双引号时才有效。

("([^"]+)")

如何编写一个正则表达式,它具有相同的功能,但也适用于带有双引号和前面斜杠的字符串?

"Valid string"      //VALID
"Valid \"string\""  //VALID
"Invalid " + "string"  //INVALID
"Invalid " + "\"string\""  //INVALID

长期问题

我正在构建自己的gettext实现 - 我发现官方的gettext应用程序(http://www.gnu.org/s/gettext/)不足以满足我的需求。

这意味着我需要自己查找每个C#代码文件中的所有字符串,但只需将那些传递给特定函数的字符串作为唯一参数。

我构建了一个获取大部分字符串的正则表达式。函数Translate是public,static,位于名称空间GetTextLocalization和Localization类中。

(GetTextLocalization\.)?(Localization\.Translate)\("([^"]+)"\)

当然,这只会找到单独的字符串,并且不会找到任何带有逐字字符的字符串。如果字符串参数作为操作传递(“字符串a”+“字符串b”)或以逐字(@“逐字字符串”)开头,则它不会解析,但这不是问题。

正则表达式定义:

([^"]+)

说字符串里面一定没有双引号,我知道公司里没有人在参数中传递它时以某种方式连接字符串。尽管如此,我仍然需要将这种结构作为一种安全的“假设”措施。

但这也会导致问题。双引号实际上可以在那里。

Localization.Translate("Perfectly valid String with \"double quotes\"")

我需要更改正则表达式,因此它将包含带双引号的字符串(所以我会跳过像翻译(“a”+“b”)这样会混淆翻译目录的内容) ,但只包含以斜线开头的那些。

我想我可能需要以某种方式使用这个(?!)分组构造,但我不知道在哪里放置它。

1 个答案:

答案 0 :(得分:4)

由于您可能希望在引用前允许加倍反斜杠,我建议

"(?:\\.|[^"\\])*"

<强>解释

"        # Match "
(?:      # Either match
 \\.     # an escaped character
|        # or
 [^"\\]  # any character except " or \
)*       # any number of times.
"        # Match "

这与"hello""hello\"there""hello\\"匹配,但在"hello" there""hello\\" there"上失败。