Javascript TeX 的正则表达式由 $$ 括起来
Javascript Regex for TeX enclosed by $$
正则表达式专家!
考虑到我们有以下文本,我试图找到一个 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 % = $+\frac{1}{5}$$
f) 1 % = $[=11=].05 - \frac{1}{5}$$
到目前为止,我得出的结论是:
/^${2}[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\|,.<>\/ ?]*(${2}|[\n\r]| )$/g
正如您所预料的那样,可耻的是它不起作用!以下是我遇到的一些问题:首先,我很难检测到 \frac
或 \
。虽然我添加了 \
,但仍然失败。其次,我对 $$
后面可以跟 space
、newline
、,
或 .
这一事实有疑问,所以即使我将表达式指定为在最后寻找 $$
,仍然无法捕捉到很多情况。
我知道我不是第一个尝试过此操作的人,所以请分享您的想法或建议。预先感谢您的帮助!
您的 ^${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 % = $+\frac{1}{5}$$\n f) 1 % = $[=12=].05 - \frac{1}{5}$$";
console.log(str.match(rx));
// => ["$$\frac{1}{10}$$","$$\frac{1}{3}$$","$$\frac{2}{100}$$","$$\frac{1}{9}$$","$+\frac{1}{5}$$","$[=12=].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}"]
正则表达式专家!
考虑到我们有以下文本,我试图找到一个 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 % = $+\frac{1}{5}$$
f) 1 % = $[=11=].05 - \frac{1}{5}$$
到目前为止,我得出的结论是:
/^${2}[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\|,.<>\/ ?]*(${2}|[\n\r]| )$/g
正如您所预料的那样,可耻的是它不起作用!以下是我遇到的一些问题:首先,我很难检测到 \frac
或 \
。虽然我添加了 \
,但仍然失败。其次,我对 $$
后面可以跟 space
、newline
、,
或 .
这一事实有疑问,所以即使我将表达式指定为在最后寻找 $$
,仍然无法捕捉到很多情况。
我知道我不是第一个尝试过此操作的人,所以请分享您的想法或建议。预先感谢您的帮助!
您的 ^${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 % = $+\frac{1}{5}$$\n f) 1 % = $[=12=].05 - \frac{1}{5}$$";
console.log(str.match(rx));
// => ["$$\frac{1}{10}$$","$$\frac{1}{3}$$","$$\frac{2}{100}$$","$$\frac{1}{9}$$","$+\frac{1}{5}$$","$[=12=].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}"]