简短问题
让我们有一个正则表达式,它读取双引号内的字符串。该字符串仅在内部没有双引号时才有效。
("([^"]+)")
如何编写一个正则表达式,它具有相同的功能,但也适用于带有双引号和前面斜杠的字符串?
"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”)这样会混淆翻译目录的内容) ,但只包含以斜线开头的那些。
我想我可能需要以某种方式使用这个(?!)分组构造,但我不知道在哪里放置它。
答案 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"
上失败。