用变量和锚点替换RegExp

时间:2018-10-12 16:58:26

标签: javascript regex

我已经做过一些研究,例如'How do you use a variable in a regular expression?',但是没有运气。

这是给定的输入

const input = 'abc $apple 123 apple $banana'

每个变量都有其自己的值。

目前,我能够使用给定字符串查询所有变量

const variables = input.match(/([$]\w+)/g)

使用以下代码通过循环variables数组进行替换无法成功

const r = `/(\$${variable})/`;
const target = new RegExp(r, 'gi');
input.replace(target, value);

但是,如果不使用变量,它将被执行

const target = new RegExp(/(\$apple)/, 'gi');
input.replace(target, value);

我还将变量标志从$更改为%#,并且它与以下代码兼容,

// const target = new RegExp(`%{variable}`, 'gi');
// const target = new RegExp(`#{variable}`, 'gi');
input.replace(target, value);

在这种情况下如何将$符号与变量匹配?

3 个答案:

答案 0 :(得分:1)

大约一年以来,我几乎每天都在使用正则表达式。我会发表自己的想法,然后说:

  

正则表达式在查找文本或数据的一部分时最有用   文件。

如果其中包含“苹果”或某些派生词的文本文件,则正则表达式可能是一个很好的工具。在撰写外国新闻翻译(基于HTML)时,我每天都会使用它们来解析HTML内容。

我相信发布的代码是用JavaScript编写的(因为我看到了replace(//,"gi")这个脚本语言所使用的函数。我自己使用了Java's java.util.regex包,其语法是只是稍有不同。

如果您要做的只是在字符串中放置一个“占位符”,我想这代码可以工作,但是,再次理解为什么需要“正则表达式”似乎是真正的问题。在此示例中,我使用了&符号作为占位符-因为我知道一个事实,它不是(大多数但不一定是所有)正则表达式编译器使用的“保留关键字”之一和处理器。

var s1 = "&VAR1"; // Un-used variable - leaving it here for show!
var myString = "An example text-string with &VAR1, a particular kind of fruit.";
myString.replace(/&VAR1/gi, "apple");

如果您想以一种很好的方式来练习正则表达式,请访问此网站并试用它们:

  

https://regexr.com/

以下是RegEx模式(从该站点复制)的“保留键符号”的规则:

  

以下字符具有特殊含义,应在前面加上   用\(反斜杠)表示文字字符:   + *?^ $。[] {}()| /

     

在字符集中,只需要转义\,-和]。

此外,“最重要”的种类-正则表达式在Java中是“编译”的。我不确定它们在Java脚本中的工作方式- ,但是在正则表达式的Compiled-Expression部分中没有诸如“变量”的概念-仅在文本和数据中分析。 是什么意思-如果您想更改Java中特定文本或数据中的搜索内容,则必须使用以下方法重新编译表达式:

  

模式p = Pattern.compile(regExString,标志);

没有一种简单的方法可以“动态地更改”表达式中文本的特定值。它将增加的复杂性将是天文数字,其价值则是最小的。相反,只需在代码中编译另一个表达式,然后再次搜索即可。另一种选择是更好地理解.* .+ .*? .+?甚至(.*) (.+) (.*?) (.+?)之类的东西,以使发生变化,发生变化的事物以及保持不变的事物不会发生!

例如,如果您使用此模式来匹配不同变量:

input.replace(/&VAR.*VAREND/gi, "apple");

您所有的变量都可以通过重复使用的模式来识别:“&VAR-stuff-VAREND”,但这只是 数百万种 的更改方式想法-给猫剥皮。

答案 1 :(得分:1)

如果理解正确,请使用with tf.Session as sess: sess.run(train_init_op) image_train, label_train = next_element sess.run(valid_init_op) image_val, label_val = next_element sess.run(test_init_op) image_test, label_test = next_element

您可以在Fiddle下方检查,如果只有一个斜杠,则将导致RegExp为(\\$${variable})(斜杠和以下字符被转义:\ $ => $),但是/($apple)/gi表示结尾正则表达式中的字符串如果不能转义的话。

因此解决方案是添加另一个斜杠。

就像下面的演示一样:

$

答案 2 :(得分:1)

使用replace回调函数,您可以避免为每个变量构建单独的正则表达式,并立即全部替换它们:

const input = 'abc $apple 123 apple $banana'

const vars = {
   apple: 'Apfel',
   banana: 'Banane'
}

let result = input.replace(/\$(\w+)/g, (_, v) => vars[v])

console.log(result)

如果applebanana是局部变量,这将不起作用,但是使用局部变量还是个坏主意。