【问题标题】:How to replace multiple dollar ($) signs by pound signs in a Javascript MathJax text string?如何用 Javascript MathJax 文本字符串中的英镑符号替换多个美元 ($) 符号?
【发布时间】:2020-11-28 02:16:25
【问题描述】:

在字符序列中:- $$ \sin \theta $$ 我想用£ 替换每个$


(编辑:从那以后,我了解到以下方法太过分了,请忽略它。我添加了一个与一些关键学习点相关的答案。但感谢 Jojo 先生为原始问题提供了答案)。


我已经查看了这个问题的答案:- better-way-to-escape-dollar-signs-in-the-string-used-by-string-prot

我已尝试应用 Leonid 的答案:-

var str = ..., reg = ...;
function replaceString(replaceValue) {
  return str.replace(reg, function () { return replaceValue });
}

这是我的解释:-

var str = "$$ \sin \theta $$";
//var reg = "/\$/g" ;// TIL: reg is a regular expression so doesn't need "".
var reg = /\$/g ; //... I tried varying the number of $ and/or backslashes,` without success so far.
var replaceValue = "£";
var output = replaceString( replaceValue ); 

//-----------------------------------------------

function replaceString( replaceValue ) 
{
  return str.replace ( reg, function () { return replaceValue });
}

//-----------------------------------------------

// desired output =  "££  \sin \theta ££"
// actual output  =  "$$  sin \theta $$".

它不工作。

【问题讨论】:

  • 传递给str.replace 的函数应该只是字符串本身,所以:str.replace(/\$/g, '£') 可以工作
  • "/\$/g" 不是正则表达式,而是字符串;文字字符序列/$/gstr 中没有出现,因此它不会被替换。 /\$/g 将针对每个 $/\${2}/g 将针对 $s 对。 /\${2,}/g 将针对至少两个 $s 的组。阅读documentation on replaceregular expressions
  • @user4642212。感谢您澄清正则表达式。我确实希望针对每一个$。我浏览了那些推荐的文档,但仍然不知道如何避免丢失\sin 中的反斜杠。
  • @Tom 感谢您指出正则表达式字符串的格式。但是如果我进入控制台:rep = "$$ \sin \theta $$".replace(/\$/g, '£'),我得到的答案是"££ sin heta ££"。但根据我的“答案”,我想我现在更了解事情了。

标签: javascript mathjax


【解决方案1】:

只需使用replaceAll() 方法

let s1 = "$$  \sin \theta $$"
  , s2 = s1.replaceAll('$','£')
  ;
console.log ( s2 )

【讨论】:

  • 虽然这有效,但它并没有真正回答问题的问题,即 OP 使用正则表达式作为字符串而不是正则表达式。
  • @Samathingamajig 你不认为想象需要一个无用(而且写得不好)的正则表达式是一种误导吗?并且他想使用简单的替换而不是替换全部?寻找并发症有什么意义?
  • @Mister Jojo,感谢这肯定解决了 $£ 的问题,但不幸的是,输出缺少两个反斜杠和一个 t
  • @steveOw 在字符串文字中,反斜杠需要用另一个反斜杠转义。 "\s" === "s""\t" 是制表符。
  • @user4642212 是的,谢谢,我有点意识到这一点。我需要看看 html 是如何存储我的文本字符串的,看起来它在内部使用了双反斜杠(正如调试器所报告的那样),这会使事情变得简单。
【解决方案2】:

感谢 Jojo 先生,我了解到 replaceAll() 是解决我特定问题的最佳方式。


我还学到了一个关键点:字符串表达式的显示方式取决于(a)它的输入方式和(b)它的显示方式。

(1) 如果您在 .html 文档中将 $$ \sin \theta $$ 输入到 <div> 中,或者在实时 textbox 中输入,则调试器会将项目显示为 $$ \\sin \\theta $$,console.log 会将其显示为 @987654326 @。

(2) 如果您在 javascript 脚本中键入 str = String.raw #$$ \sin \theta $$#(其中 # 代表坟墓字符),那么调试器会将项目显示为 $$ \\sin \\theta $$,console.log 会将其显示为 $$ \sin \theta $$

(3) 但是,如果您在 javascript 脚本中键入 str = "$$ \sin \theta $$",则调试器会将项目显示为 $$ \sin \theta $$,console.log 会将其显示为 $$ sin heta $$


最后我了解到使用.split 函数可以避免正则表达式,例如:-

//Method 1 enter   $$ \sin \theta = 0.5 $$  into a <div> 
//   or type/paste into a live input textbox 
//    debugger shows value as  $$ \\sin \\theta = 0.5 $$ 
// console.log shows value as  $$ \sin \theta = 0.5 $$   == GOOD.

//Method 2 define inputStr in a script or console using String.raw 
let inputStr = String.raw `$$ \sin \theta = 0.5 $$`;
// debugger    shows value as  $$ \\sin \\theta = 0.5 $$ 
// console.log shows value as  $$ \sin \theta = 0.5 $$   == GOOD.

//Method 3 define inputStr in a script or console
//let inputStr = "$$ \sin \theta = 0.5 $$"; 
// debugger    shows value as  $$ \sin \theta = 0.5 $$      
// console.log shows value as  $$  sin  heta = 0.5 $$    == BAD.

  
let tempArray = inputStr.split("") ;
var numChars = tempArray.length;

//... Replace HOT characters (e.g. "$" "\") by COOL characters (e.g. "£" "@" )

var outVal="";
for (var iii = 0; iii < numChars; iii++ )
{
    var aVal = tempArray[iii];
    if      ( aVal == "$" ) {aVal = "£"}  
      //else if ( aVal == "\" ) {aVal = "@"} ; // --> js error
    else if ( aVal == "\\") {aVal = "@"} ; //... to replace single backslash

    outVal += aVal;             
}
        
//... Test that string can be converted back ...

var checkVal = "";
for (var iii = 0; iii < numChars; iii++ )
{
    var cVal = outVal[iii];
    if      ( cVal == "£") {cVal = "$" } 
    else if ( cVal == "@") {cVal = "\\"} ; 
    checkVal += cVal;           
}
console.log (" input string    =", inputStr);
console.log ("converted outVal =", outVal  );
console.log ("        checkVal =", checkVal);   


// Actual results in console.log using method 2:-

//  input string    = $$ \sin \theta = 0.5 $$
// converted outVal = ££ @sin @theta = 0.5 ££
//         checkVal = $$ \sin \theta = 0.5 $$ 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2021-07-13
    相关资源
    最近更新 更多