簡體   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