Regex 是否可以在正则表达式中匹配这4种赋值模式?
在许多语言中,可以将字符串分配给变量:Regex 是否可以在正则表达式中匹配这4种赋值模式?,regex,Regex,在许多语言中,可以将字符串分配给变量: var = "some 'quoted' string" var = 'some "quoted" string' var = `some 'quoted "quoted" string` var = somestring 当然,在最后一个变体中,空格是不可能的,字符串的结尾由一些特殊字符标记,如;html中的空格或> 但我的问题是用一个正则表达式匹配所有这4种情况的可能性。更糟糕的情况是使用引号时,必须在字符串末尾搜索第一个字符,但转义除外 var =
var = "some 'quoted' string"
var = 'some "quoted" string'
var = `some 'quoted "quoted" string`
var = somestring
当然,在最后一个变体中,空格是不可能的,字符串的结尾由一些特殊字符标记,如;html中的空格或>
但我的问题是用一个正则表达式匹配所有这4种情况的可能性。更糟糕的情况是使用引号时,必须在字符串末尾搜索第一个字符,但转义除外
var = (?:([`'"])(?:(?!\1).)*\1|[^\s;>]*$)
适用于您的示例。如果您还想处理转义引号,请尝试
var = (?:([`'"])(?:(?!\1)(?:\\.|.))*\1|[^\s;>]*$)
作为详细的正则表达式:
var\s*=\s*
(?: # match either:...
([`'"]) # one of the quote characters, then...
(?: # match the following any number of times:
(?!\1) # first assert that the next character isn't the quote we matched earlier
(?: # if so, then match either
\\. # an escaped character
| # or
. # an unescaped character
)
)* # repeat as often as needed
\1 # then match the opening quote character again
| # ...or...
[^\s;>]* #match any suite of characters except whitespace, ; or > up to...
$ # the end of the line/string
)
最简单的方法是使用备选格式,并分别描述每种格式:
var = ("[^"]*"|'[^']*'|`[^`]*`|[^;\s>]*)
如果希望允许在转义时使用每个分隔符,请按如下方式添加该大小写:
var = ("([^\\"]|\\")*"|'([^\\']|\\')*'|`([^\\`]|\\`)*`|[^;\s>]*)
如果您想允许对其他字符(甚至任何字符)进行转义,请将相应的转义序列替换为包含字符
\\[…]
的字符类,或对任何字符使用\.
。从未见过对字符串文本使用反勾号的语言…Sqlite将其用于表名和列名,因此,可以在它们中使用单引号和双引号。另外,ruby或python(我不太记得了)使用自定义字符串开头和结尾字符的概念。但不允许您转义引号符号。没有必要排除最后一部分中的引号;如果你达到了这一点,你就知道这个值没有被引用。你应该排除空白。此外,OP说可能有一个哨兵像
或代码>标记一个未引用的值的结尾,但我认为这将是一件逐案处理的事情:[^\s>]*
,[^\s;]*
@Alan Moore:这一点很好。现在,我在修订后的答案中加入了这两个分隔符;当然,OP可以将其更改为他/她需要的任何内容。