Javascript 正则表达式匹配双引号或单引号中的字符串,后跟空格
我正在尝试匹配字符串,它可以是单引号或双引号之间的字符串,并且后面必须跟一个特定的文本Javascript 正则表达式匹配双引号或单引号中的字符串,后跟空格,javascript,regex,Javascript,Regex,我正在尝试匹配字符串,它可以是单引号或双引号之间的字符串,并且后面必须跟一个特定的文本 输入: <title ng-bind="'key_name' | i18n"></title> 以下正则表达式应适用于您: ["']([^"']+?)['"]\s*\|\s*i18n 请点击此处: 此表达式适用于您发布的三个示例,但总体而言,它不是很灵活 /(?:\{\{\s*|"\s*(?=')|'\s*(?="))((['"]).*?\2)\s\|\si18n/ // With
输入
:
<title ng-bind="'key_name' | i18n"></title>
以下正则表达式应适用于您:
["']([^"']+?)['"]\s*\|\s*i18n
请点击此处:
此表达式适用于您发布的三个示例,但总体而言,它不是很灵活
/(?:\{\{\s*|"\s*(?=')|'\s*(?="))((['"]).*?\2)\s\|\si18n/
// Without capturing quotes:
/(?:\{\{\s*|"\s*(?=')|'\s*(?="))(['"])(.*)?\1\s\|\si18n/
实际匹配将分别出现在[1]
和[2]
中。您可能需要将一些\s
更改为\s*
或\s+
.*(["'])([^)]*?)\1\s*?\|\s*?i18n
开头的“*”必须与尽可能少的字符数匹配。对第一个捕获的反向引用是为了确保两个引号都匹配。允许在“|”周围使用任意数量的空格。不过,这是假设要捕获的文本中没有未替换的引号。匹配结果为$2,因为$1用于保留引号。引号中的子字符串是否总是一个单词,如
关键字名称
?如果是这样,这就是您所需要的全部:
([“'))(\w+)\1\s*\\s*i18n\b
如果不是,这可能会使您正确:
([“'))([^']+)\1\s*\\124;\ s*i18n\b
在任何一种情况下,您正在寻找的部分都将被捕获到第2组中。如果您的需求比这更复杂,我们将需要更多信息。怎么样?@Ali在您留下评论时我正在更新它。检查新的正则表达式。它将为您提供
\u添加事件
,\u需要_登录
和\u添加事件
我是基本的巧妙地调整它,使其不贪婪,并从捕获的组中删除引号。仅供参考,将加号更改为星号并不会使正则表达式不那么贪婪,但会使其更加健壮。也许OP知道每个点中始终只有一个空格,但最好假设在/除非OP另有说明。@Alanmore我同意。当我说要使其非贪婪时,我指的是一个没有反映在修订中的编辑:)你看到的编辑就是要完全按照你说的做:允许类似于'key\u name'| i18n
的东西,这在Django的模板(或类似的模板系统)中完全有效。它甚至捕获了一个引号?@Ali不应该吗?我想它应该只返回键名而不包含引号?@Ali我更新了我的答案,将捕获的内容中排除引号。*
不需要匹配任何内容,但它希望匹配所有内容。通过添加它,您已经创建了一个匹配的正则表达式从字符串的开头到最后一个'key_name'|i18n
实例,我很确定OP不希望这样。
["']([^"']+?)['"]\s*\|\s*i18n
/(?:\{\{\s*|"\s*(?=')|'\s*(?="))((['"]).*?\2)\s\|\si18n/
// Without capturing quotes:
/(?:\{\{\s*|"\s*(?=')|'\s*(?="))(['"])(.*)?\1\s\|\si18n/
.*(["'])([^)]*?)\1\s*?\|\s*?i18n