Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 是否可以在正则表达式中匹配这4种赋值模式?_Regex - Fatal编程技术网

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可以将其更改为他/她需要的任何内容。