繁体   English   中英

正则表达式与'\\'斜杠匹配,并替换为'\\\\'?

[英]Regex match with '\' slash and replace with '\\'?

我将普通字符串转换为乳胶格式。因此我创建了乳胶代码匹配项,并将\\单斜杠替换为\\\\双斜杠。为什么我需要它参考此链接 。我尝试了以下代码:

 function test(){ var tex="$$\\left[ x=\\left({{11}\\over{2}}+{{\\sqrt{3271}}\\over{2\\,3^{{{3}\\over{2} $$"; var tex_form = tex.replace("/[\\\\\\/\\\\\\\\\\.\\\\\\\\]/g", "\\\\"); document.getElementById('demo').innerHTML=tex_form;//nothing get } test(); 
 <p id="demo"></p> 

没有获得任何输出数据。但是此链接中的匹配项

我希望将\\替换为\\\\

存在以下问题:

  1. 字符串文字没有反斜杠;

  2. 正则表达式不是正则表达式;

  3. 预期正则表达式中的类不能匹配序列 ,只能匹配单个字符;不能匹配序列

  4. 替换不会添加反斜杠,仅替换为反斜杠。

在这里,您可以找到有关每个点的详细信息:

1.如何在字符串文字中编码反斜杠

您的tex变量没有反斜杠。 这是因为字符串文字中的反斜杠不被当作文字反斜杠,而是作为解释其后的字符的转义符。

当您有"$$\\left..."\\l表示“ literal l” ,因此变量的内容为:

$$left...

因为l不需要转义,所以反斜杠是完全没有必要的,并且这两个赋值导致了相同的字符串值:

var tex="$$\left[ x=\left({{11}\over{2}}+{{\sqrt{3271}}\over{2\,3^{{{3}\over{2} $$";

var tex="$$left[ x=left({{11}over{2}}+{{sqrt{3271}}over{2,3^{{{3}over{2} $$";

为了使点回家,这表示相同的值:

var tex="\$\$\l\e\f\t\[\ \x\=\l\e\f\t\(\{\{\1\1\}\o\v\e\r\{\2\}\}\+\{\{\s\q\r\t\{\3\2\7\1\}\}\o\v\e\r\{\2\,\3\^\{\{\{\3\}\o\v\e\r\{\2\}\ \$\$";

如果您真的想在内容中使用文字反斜杠(据我所知,因为这是关于LaTeX的,那么您确实需要这样做),那么您需要使用反斜杠对每个反斜杠进行转义:

var tex="$$\\left[ x=\\left({{11}\\over{2}}+{{\\sqrt{3271}}\\over{2\\,3^{{{3}\\over{2} $$";

现在,您的tex变量的内容将是以下字符串:

$$\left[ x=\left({{11}\over{2}}+{{\sqrt{3271}}\over{2\,3^{{{3}\over{2} $$

2.如何编码正则表达式文字

您确实要将字符串文字传递给replace的第一个参数,而您确实打算传递正则表达式文字。 您应该省略引号以免发生这种情况。 /是正则表达式文字的定界符,而不用引号引起来:

/[\\\/\\\\\.\\\\]/g

不应用引号引起来。 JavaScript将/分隔符理解为表示正则表达式文字,包括末尾的可选修饰符(如此处的g )。

3.类是单个字符的集合

此正则表达式包含不必要的字符。 [...]应该列出你想匹配所有单个字符。 当前,您具有以下字符(在解决了转义符之后):

\
/
\
\
.
\
\

反斜杠代表5次实在是太过分了。 同样,在JavaScript中,正斜杠和点在类中发生时不需要转义。 因此,上面的正则表达式与此等效:

/[\\/.]/g

也许这是或不是您想要匹配的内容。 要匹配多个字符序列,可以使用| 操作员。 这只是一个例子:

/\\\\|\\\/|\\\./g

...但是我认为您不需要这个。

4.如何实际使用反斜杠作为前缀

对于我来说,您想用反斜杠替换点或正斜杠似乎很奇怪。 也许你想那些前缀用反斜杠。 在这种情况下,创建一个捕获组(带有括号),并在此replace$1引用它:

tex.replace(/([\\/.])/g, "\\$1");

再次注意,替换字符串中仅存在一个文字反斜杠,因为第一个是转义符(请参见上面的第1点)。

为什么我需要它

正如您链接到的问题所说, \\字符在JavaScript字符串文字中具有特殊含义。 它代表一个转义序列

没有获得任何输出数据。但是此链接中的匹配项

当JavaScript编译器解析字符串文字时,将处理转义序列。

当您将正则表达式应用于它们时,它们已被消耗。 斜杠字符仅存在于您的源代码中,而不存在于您的数据中。

如果要在字符串中添加斜杠字符,则需要在源代码中为其编写转义序列( \\\\ )。 之后,您将无法再使用JavaScript将其重新添加。

不知道我是否理解了问题,但是请尝试以下代码:

var tex_form = tex.replace("/(\\)/g","\\\\");.  

您需要使用'(' ')'而不是'['']'来获得输出的匹配项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM