【问题标题】:Find and alter text in a string based on ln # and character #根据 ln # 和字符 # 查找和更改字符串中的文本
【发布时间】:2014-07-11 23:39:43
【问题描述】:

如何在文本中位于特定 Ln # 和字符 # 的单词前面添加字符?

示例:

用例是当一个人将代码输入文本区域(如 jsFiddle)时,我会查找并替换其中的一些变量。我知道这些变量的开始和结束的行号和字符位置。

示例文本:

var usersCode = $('textarea').val();

控制台日志usersCode:

print "My first name is: " + first_name
print "This is awesome."
print "My last name is: " + last_name

我怎样才能找到从 Ln 0, Char 29 开始并以 Ln 0, Char 39 (first_name) 结束的单词并将其转换为 MyObj.first_name.value

print "My first name is: " + MyObj.first_name.value
print "This is awesome."
print "My last name is: " + last_name

也许我可以使用将“行号”转换为计算\n 出现次数的正则表达式?然后将指针移入字符数?

我必须使用 Ln # 和 Char # 来获取许多我不会在这里讨论的细节。如果我不限于使用 Ln # 和 Ch #,我知道有许多更简单的选择。

【问题讨论】:

    标签: javascript jquery regex


    【解决方案1】:

    您可以将 textarea 的行保存到一个数组中:

    var lines = $('#textarea').val().split(/\n/);
    

    然后从那里获取特定行的子字符串并将其分配给您的对象:

    MyObj.first_name.value = lines[0].substring(29,39)
    

    希望有帮助!

    【讨论】:

      【解决方案2】:

      如果您只是想替换first_namelast_name,最简单的解决方案是使用replace(),例如:

      usersCode.replace("first_name", MyObj.first_name.value);
      usersCode.replace("last_name", MyObj.last_name.value);
      

      如果您坚持做特定于行号和字符号的事情,我们可以安排,但对于您所要求的似乎完全没有必要。不过,也许我弄错了。

      更新:

      好的,您想替换所有实例吗?查找行号和所有这些仍然是不必要的,只需使用这个:

      usersCode.replace(/first_name/g, MyObj.first_name.value);
      usersCode.replace(/last_name/g, MyObj.last_name.value);
      

      g 是用于全局搜索的 RegEx 标志。

      更新 2:

      usersCode.split("\n")[lineNumber - 1].replace(usersCode.split("\n")[lineNumber - 1].substr(29, 39), MyObj.first_name.value);
      

      您可以将2939 分别替换为变量startCharendCharlineNumber 也需要您提供。

      【讨论】:

      • 可以是任意文本,因此first_name 的出现次数可能很多。还有许多其他复杂情况使得使用 Ln # 和 Ch # 成为一项要求。例如,我使用 CodeMirror 而不是 textarea... 这意味着有很多关于不使用更简单方法的细节。
      • 感谢更新,但不,我不想替换所有实例。我只想替换特定行和字符号的实例。
      • 如果有任意文本,则表明您不想对行号和字符号进行硬编码。客户总是对的,所以给我两秒钟。
      • 谢谢 :) 我不是硬编码行号和字符,用户在编辑器中单击变量名,作为事件处理程序,我得到变量名的 Ln # 和 Char # ...然后切换它
      • 真棒 sxnine - 感谢您试一试,我现在就试试。
      【解决方案3】:

      RegEx 可以轻松地根据字符进行搜索,但不能通过位置进行搜索。虽然你仍然可以使用正则表达式来完成,但灵魂会变得越来越复杂。对于这种情况,您不需要纯正则表达式答案。下面的代码就是你需要的。

      k=$('#regex_string').val()
      
      function findAndReplaceWord(lineNo, startPos, endPos, replaceWith) {
          var line = k.split(/\n/)[lineNo];
          if(line) {
              var word = line.substring(startPos, endPos)
      
              return k.replace(word, replaceWith)
          }
      }
      
      findAndReplaceWord(0, 29, 39, MyObj.first_name.value)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-23
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多