Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.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中编写正则表达式以匹配$variable前缀语法(如Bash脚本中的正则表达式)_Javascript_Regex_Actionscript 3_Regex Group - Fatal编程技术网

在JavaScript中编写正则表达式以匹配$variable前缀语法(如Bash脚本中的正则表达式)

在JavaScript中编写正则表达式以匹配$variable前缀语法(如Bash脚本中的正则表达式),javascript,regex,actionscript-3,regex-group,Javascript,Regex,Actionscript 3,Regex Group,我试图用JavaScript编写一个正则表达式来搜索多行bash脚本并提取所有变量名。我似乎既不能自己弄明白,也找不到一个完全符合我需要的脚本 我已经走了这么远: var re = /(?:^|\W)\$(\w+)(?!\w)/g; var s = "test $test1 testagain$test2 testyetagain $test3 $test4$test5"; var matches = []; while (match = re.exec(s)) { matches.push

我试图用JavaScript编写一个正则表达式来搜索多行bash脚本并提取所有变量名。我似乎既不能自己弄明白,也找不到一个完全符合我需要的脚本

我已经走了这么远:

var re = /(?:^|\W)\$(\w+)(?!\w)/g;
var s = "test $test1 testagain$test2 testyetagain $test3 $test4$test5";
var matches = [];
while (match = re.exec(s)) {
  matches.push(match[1]);
}
这将给我“test1”、“test3”和“test4”。但我也希望得到“test2”和“test5”

如果有一种方法可以使“\$”在字符串中出现时不匹配,那就太好了。换句话说,是否有办法转义文本中的“$”字符串,以便正则表达式忽略它?因此,如果文本中出现“\$1.00”,它将不会像上面的正则表达式那样匹配“1”

提前感谢您的帮助或为我指明了正确的方向

PS这实际上是针对ActionScript3的,但是在JavaScriptPre-ES6中工作的任何东西都应该在AS3中工作


PPS最终目标是用键值散列中的变量替换这些匹配。

您可以重复匹配
\$
(在这种情况下,不执行任何操作)或
$\w+
(在这种情况下,它是一个未替换的美元符号,指示要匹配的变量的开始)。使用replace函数决定是保留匹配项,还是替换为所需的任何其他字符串:

const replacements={
test1:'testone',
test2:'testtwo',
test3:'testthree',
test4:'testfour',
测试五:“测试五”
};
var s=“test$test1 testagain$test2 testyetagain$test3$test4$test5\\\$1.00”;
const result=s.replace(
/\\\$\$(\w+)/g,
(匹配,g1)=>匹配==='\\$'
?匹配//替换为匹配的字符串-换句话说,保持不变
:替换[g1]
);
控制台日志(结果)此表达式

(?:\\{2,}\$[0-9.]+)|\$([^$\s]+)
使用非捕获组收集不需要的数据

(?:\\{2,}\$[0-9.]+)
([^$\s]+)
并使用捕获组返回所需的数据

(?:\\{2,}\$[0-9.]+)
([^$\s]+)
const regex=/(?:\{2,}\$[0-9.]+)\$([^$\s]+)/g;
const str=`test\$test1 testagain\$test2 testyetagain\$test3\$test4\$test5\$1.00\$1.00
`;
让m;
while((m=regex.exec(str))!==null){
//这是避免具有零宽度匹配的无限循环所必需的
if(m.index==regex.lastIndex){
regex.lastIndex++;
}
//可以通过'm`-变量访问结果。
m、 forEach((匹配,组索引)=>{
log(`Found match,group${groupIndex}:${match}`);
});
}
您可以使用此正则表达式

(?<!\\)\$([^\W$]+)
(?
  • (?-反向查找以避免匹配
    \$
  • \$
    -匹配
    $
  • ([^\W$]+)
    -匹配除word非word字符和$

尝试匹配
(?:\\\$\w+)\$(\w+)
。由于第一个组较早开始匹配,它将首先完成匹配;但作为非捕获块,不会返回。
var re=/(?:\\\$\w+)\$(\w+)/g;
var s=“test$test1 testagain$test2 testyetagain$test3$test4$test5\\\$1.00”;
var匹配=[];
而(匹配=重新执行){
匹配[1]&匹配.push(匹配[1]);
}

console.log(matches);
我选择这个答案作为第一个解决方案,但有一些警告。首先,我需要调整lambda,使其能够在AS3(ES6之前的ECMA4标准)中工作。我还发现它想要返回“\\$”而不是简单的“$”,我在replace函数中很容易地修复了“$”:const result=s.replace(/\\$\\\\$)\$(\w+)/g、 函数(match,g1,index,complete):字符串{return match===='\\\$'?“$”:“blorch”});最后,如果我可以在字符串和/或文本文件中使用一个“\$”来转义“$”符号而不是双“\\$”,那就太好了。但我还没有做到这一点。如果我必须做“\\\$”的话,我可以自己生活现在。如果你想避免双重转义反斜杠,你可以在Javascript字符串文本中使用
String.raw
,如果这是你想要的,
String.raw`foo\bar`==='foo\\bar'
,这是一个很棒的建议。但是,这实际上不是Javascript。这是动作脚本3,所以我没有String.raw。我确实使用了J但是avascript在其他地方,所以这是一个很好的特性!这是一个很好的答案,我没有选择它的唯一原因是因为某些性能也满足了我摆脱“$”的需要必要时签名。但是,我还是想说我真的很喜欢这个答案和它的图形解释。谢谢!对不起,我的浏览器是从昨晚开始缓存的,我看到你为$添加了反向查找。我认为在ES5(即ECMA 4/AS3)之前,反向查找在Javascript中不起作用。如果我错了,请纠正我。这也是一个很好的答案,但当我实现replace时,我的结果是“.00”而不是“$1.00”。尽管其他匹配项可以正确替换。这可能是AS3的一个怪癖。考虑一下,它可能会替换整个匹配项,而不是组[1]。正则表达式仍然匹配
\$1.00
(匹配
\$1
,因为.与\w元字符不匹配。)但是,匹配的组[1]将是未定义的。很有趣,因此我可以测试group1值以确定它是否是转义的“$”或者不是。你是对的,当我继续处理这个问题时,我开始匹配$1,就好像这是变量一样。我对我当前的解决方案没意见,因为它允许我继续前进,但我很想重新审视这个答案,并在将来完善我的解决方案。与所选择的解决方案类似,你可以使用类似
函数的替换函数(match,g1){return g1&&replacement(g1)| | match;}
这很好,但我想你误解了我用“$1.00”的意图。我用金钱作为一个真实的例子,说明什么时候逃离“$”才是可取的但我想不管后面是否跟数字都能逃过它。不过,谢谢你的视觉效果。这大大帮助了我的理解!