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