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