Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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
javascript字符串的javascript正则表达式_Javascript_Regex - Fatal编程技术网

javascript字符串的javascript正则表达式

javascript字符串的javascript正则表达式,javascript,regex,Javascript,Regex,我需要匹配一个javascript字符串和一个正则表达式,这是一个由单引号括起的字符串,只能包含一个反斜杠单引号 我将匹配的示例字符串如下所示: 'abcdefg' 'abc\'defg' 'abc\'de\'fg' 试试这个: /'(?:[^'\\]|\\'|\\(?!'))*'/ 在控制台中测试它: /'(?:[^'\\]|\\'|\\(?!'))*'/.exec("'abc\\\'de\\\'fg'") 会匹配的 以下任意数量的字符: “不是”或\除了 \”“或者 \后面没有' 如果

我需要匹配一个javascript字符串和一个正则表达式,这是一个由单引号括起的字符串,只能包含一个反斜杠单引号

我将匹配的示例字符串如下所示:

'abcdefg'
'abc\'defg'
'abc\'de\'fg'
试试这个:

/'(?:[^'\\]|\\'|\\(?!'))*'/
在控制台中测试它:

/'(?:[^'\\]|\\'|\\(?!'))*'/.exec("'abc\\\'de\\\'fg'")
会匹配的

以下任意数量的字符: “不是”或\除了 \”“或者 \后面没有' 如果希望它与整个字符串匹配,请使用^start of string和$end of string标记:

/^'(?:[^'\\]|\\'|\\(?!'))*'$/
。。。哪一个匹配“string”,“string's awesome”但不匹配“string's awesome”或“string's”

试试这个

/^'[a-z]*?:\'?[a-z]+'$/

参见示例


在Firebug控制台中测试。可以使用或不使用转义字符。

这是一个正则表达式,它匹配所有由单引号包围的有效JavaScript文本字符串,并拒绝所有无效字符串。注意,假设为严格模式

/'(?:[^'\\\n\r\u2028\u2029]|\\(?:['"\\bfnrtv]|[^\n\r\u2028\u2029'"\\bfnrtvxu0-9]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})|\\(?:\n|\r\n|\r(?!\n)|[\u2028\u2029]))*'/
或更简短的版本:

/'(?:[^'\\\n\r\u2028\u2029]|\\(?:[^\n\rxu0-9]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|\n|\r\n?))*'/
上面的正则表达式基于StringLiteral的定义,忽略了ECMAScript语言规范(2011年6月发布的5.1版)中指定的双引号版本

用双引号括起来的JavaScript文本字符串的正则表达式几乎相同:

/"(?:[^"\\\n\r\u2028\u2029]|\\(?:[^\n\rxu0-9]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|\n|\r\n?))*"/
让我们将怪物分解为较长的版本,因为它是语法的直接翻译:

StringLiteral忽略双引号版本,以',开始和结束,如正则表达式中所示。引号之间是一个可选的SingleStringCharacter序列。这解释了*-0或更多字符

SingleStringCharacter定义为:

SingleStringCharacter :: SourceCharacter but not one of ' or \ or LineTerminator \ EscapeSequence LineContinuation ['\\bfnrtv]|[^\n\r\u2028\u2029'\\bfnrtvxu0-9]是CharacterEscapeSequence的正则表达式。它实际上可以简化为[^\n\r\u2028\u2029xu0-9]

第一部分是SingleEscapeCharacter,它包括“,\”和控制字符b、f、n、r、t、v

第二部分是NonScapeCharacter,它是SourceCharacter,但不是EscapeCharacter或LineTerminator之一。EscapeCharacter定义为SingleEscapeCharacter、小数位数或x(十六进制转义序列)或u(unicode转义序列)

/^'([^\\'\n\r]|\\'|\\n|\\r|\\\\)*'$/
0?![0-9]是EscapeSequence第二条规则的正则表达式。这用于指定空字符\0

x[0-9a-fA-F]{2}是hexEscapeSeSequence的正则表达式

u[0-9a-fA-F]{4}是Unicode序列的正则表达式

第三条规则处理跨越多行的字符串。让我们看看LineContinuation和其他相关的语法:

续行:: \线路终止顺序 LineTerminatorSequence:: [展望未来∉ ] \\?:\n | \r\n | \r?!\n |[\u2028\u2029]对应于上述语法

没那么难

此外,您还需要检测一些其他可能的字符序列,如\n、\r或\\,在javascript中不转义就断行是无效的,您必须使用\n序列

/^'([^\\'\n\r]|\\'|\\n|\\r|\\\\)*'$/
执行中:

var sample = ["'abcdefg'", // Valid
              "'abc\\'defg'", // Valid
              "'abc\\'de\\'fg'", // Valid
              "'abc\\'\\r\\nde\\'fg'", // Valid
              "'abc\\'\r\nde\\'fg'", // Invalid
              "'abc'def'" // Invalid
             ];
for(var i = 0; i < sample.length; i++)
    console.log(sample[i].match( /^'([^\\'\n\r]|\\'|\\n|\\r|\\\\)*'$/ ));
^告诉匹配器下一个条件必须匹配字符串的开头 '将与“”分隔符匹配 打开一个组 [^\\\'\n\r]匹配与\and'不同的任何字符,并且不匹配特殊的\n和\r字符 |如果上述条件与任何情况不匹配,将测试|的右侧 \\“将匹配” \\n将匹配\n文本字符串 |\\r或将匹配\r文本字符串 |\\\\或将匹配\\文字字符串 *关闭该组并允许其重复多次,例如,允许其不存在空字符串 '将匹配最后的'分隔符' $告诉匹配器这必须是字符串的and
字符串可以包含除alpha字符和转义单引号以外的任何内容吗?这不是JavaScript正则表达式。为什么标记会显示JavaScript和正则表达式?我的意思是您的答案不是与JavaScript兼容的正则表达式,返回null。JavaScript正则表达式的符号与其他语言的正则表达式略有不同。JavaScript字符串不能包含数字s?为什么[a-z]仅?另外,这个正则表达式允许var str='@Leiko我最初问OP字符串是否可以包含除alpha字符和反斜杠单引号以外的任何内容,但没有收到答复,因此我从表面上看了提供的示例。此外,除非转义中间引号,否则var str='不是有效字符串。但是这个字符串'abc'def'Is matched尽管它不是有效的,但很容易修复,我对答案做了一点修改,只添加了^和$,现在错误的结构将不匹配。这将在JavaScript中生成可能的字符串文本。另一个问题是性能:[^\\\']之后可以删除以减少回溯。实际上,我不同意[^\\']*将导致性能问题,因为它会将每个字符匹配到一个“或\char”,因此在字符串“12345”[^\\\\\\]*中,将匹配一行中的5个字符5个记号,而不是1个记号失败和处理\\',这也将失败1个记号,并使组保留大约7个记号。如果*不存在,它将匹配1个字符1个记号,处理组1个记号匹配其他
呃char,这样做5次,让小组剩下大约12次ticks@JoséRobertoAraújoJúnior:当输入字符串不匹配时,就会出现性能问题。接得好,修正了答案。现在只有一个*所以它不会回溯,并且匹配一个空字符串。也更改为非捕获组。干杯。嗯,看起来很奇怪,因为那些正则表达式允许var str='或var str=,但它们不应该…:/好的,在挖掘一点之后,var str='是允许的,因为您的两个正则表达式没有^和$来指定开始和结束。所以,我认为这个更好:^?:[^\\\n\r\u2028\u2029]| \?:[^\n\rxu0-9]| 0?![0-9]|x[0-9a-fA-F]{2}u[0-9a-fA-F]{4}\n}\r\n*$| ^?:[^'\\\n\r\u2028\u2029]\\?:[^\n\rxu0-9]| 0?![0-9]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|\n |\r\n?*'$它同时处理和字符串:@Leiko:'不能与上面的正则表达式匹配。你可能会得到一个匹配,因为它被认为是一个匹配。是否添加锚定取决于您的用例。
var sample = ["'abcdefg'", // Valid
              "'abc\\'defg'", // Valid
              "'abc\\'de\\'fg'", // Valid
              "'abc\\'\\r\\nde\\'fg'", // Valid
              "'abc\\'\r\nde\\'fg'", // Invalid
              "'abc'def'" // Invalid
             ];
for(var i = 0; i < sample.length; i++)
    console.log(sample[i].match( /^'([^\\'\n\r]|\\'|\\n|\\r|\\\\)*'$/ ));