由$$

时间:2017-11-20 21:25:44

标签: javascript regex tex

正则表达专家!

考虑到我们有以下文字,我试图找到一个REGEX来检测由两个TeX包围的所有$$表达式。

Select the correct answer:
  a) 10 % = $$\frac{1}{10}$$.
  b) 33 % < $$\frac{1}{3}$$
  c) 2 % = $$\frac{2}{100}$$,
  d) 9 % < $$\frac{1}{9}$$
  e) 5 % = $$1+\frac{1}{5}$$
  f) 1 % = $$0.05 - \frac{1}{5}$$

到目前为止,我提出的是:

/^\${2}[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/ ?]*(\${2}|[\n\r]| )$/g
正如你可能预料的那样,可耻的不起作用!以下是我遇到的一些问题:首先,我很难发现\frac或者问题\。虽然我添加了\\,但仍然失败了。其次,$$ spacenewline,.后面$$可能会出现问题所以即使我将表达式指定为在最后寻找DEVICE STATUS CHANGE_DATE 1 1 21.11.2017 12:01 1 0 21.11.2017 13:05 1 1 21.11.2017 14:06 1 0 21.11.2017 14:26 1 1 21.11.2017 14:36 2 0 21.11.2017 15:28 2 1 21.11.2017 15:39 ,但仍然没有抓住许多案例。

我知道我不是第一个试过这个的人,请分享您的想法或建议。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您的^\${2}[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/ ?]*(\${2}|[\n\r]| )$模式过于冗长。不是将所有可能的字符列入白名单,而是可以出现双美元符号,您可以假设那里可能有任何字符。

您可以使用

/\${2}.*?\${2}/g

或者 - 如果中间可以有换行符(我怀疑):

/\${2}[\s\S]*?\${2}/g

请参阅regex demo

JS演示:

var rx = /\${2}.*?\${2}/g;
var str = "Select the correct answer:\n  a) 10 % = \$\$\\frac{1}{10}\$\$.\n  b) 33 % < $$\\frac{1}{3}$$\n  c) 2 % = $$\\frac{2}{100}$$,\n  d) 9 % < $$\\frac{1}{9}$$\n  e) 5 % = $$1+\\frac{1}{5}$$\n  f) 1 % = $$0.05 - \\frac{1}{5}$$";
console.log(str.match(rx));
// => ["$$\\frac{1}{10}$$","$$\\frac{1}{3}$$","$$\\frac{2}{100}$$","$$\\frac{1}{9}$$","$$1+\\frac{1}{5}$$","$$0.05 - \\frac{1}{5}$$"]
//or, to get what is inside

var rx_extract = /\${2}(.*?)\${2}/g;
var m, results = [];
while (m=rx_extract.exec(str)) {
  results.push(m[1]);
}
console.log(results);
// => ["\\frac{1}{10}","\\frac{1}{3}","\\frac{2}{100}","\\frac{1}{9}","1+\\frac{1}{5}", "0.05 - \\frac{1}{5}"]