【问题标题】:replace string start with >替换以 > 开头的字符串
【发布时间】:2018-05-13 00:33:31
【问题描述】:

我想从文本区域检索字符串,然后删除具有起始字符'>'的行(不管'>'前面是否有空格),删除一个或多个'- ', 然后将字符串拆分为数组,结果如下:

[BBAAAACC, CBDAAAACC, EBAAAACC, FBAAAACC]

我已经尝试使用正则表达式跟随但无法得到结果。

var data = document.getElementById("data").value.replace(/^[>-]+/g,"");
var array = data.split("\n");
console.log(array);
        <textarea rows="15" cols="50" id="data">
            		>1/1AA
            BBAAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            -------------
            >2/1B
            CBDAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            -------------
            >3/1-CD
            EBAAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            -------------
            >4/1-11
            FBAAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            ------------- 
            	</textarea>
  

【问题讨论】:

  • 如果您只需要从每行的开头获取 1+ 个大写 ASCII 字母的块,请尝试 var data = document.getElementById("data").value.match(/^\s*[A-Z]+/mg).map(x =&gt; x.trim())
  • 您的结果是否始终采用 AAABBBCCC 格式?您可以将正则表达式更改为仅匹配从 A 到 Z [A-Z]+ 的字符
  • 我想删除以'>'开头的行(前面有/没有空格),并删除所有'-'
  • 非常感谢 Wiktor,我已经尝试了您的解决方案,它有效!

标签: javascript regex replace split


【解决方案1】:

您的代码只是一个开始,您的数组需要的只是一些清理工作:

var array = document
    .getElementById("data")
    .value
    .split("\n")
    .map(l => l.trim() // Removes extra spaces before and after
             .replace(/-/g,'')) // Removes all occurrences of '-'
    .filter(l => l.length && l[0] !== ">") // Keeps only the lines with a length and not beginning with '>'

console.log(array);
<textarea rows="15" cols="50" id="data">
            		>1/1AA
            BBAAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            -------------
            >2/1B
            CBDAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            -------------
            >3/1-CD
            EBAAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            -------------
            >4/1-11
            FBAAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            ------------- 
</textarea>

【讨论】:

    【解决方案2】:

    您最初的想法是删除以 &gt; 和任何 - 符号开头的行,但您似乎只需要从每行的开头提取 1+ 个大写 ASCII 字母的块。

    你可以使用

    var data = document.getElementById("data").value.match(/^\s*[A-Z]+/mg).‌​map(x => x.trim())
    

    正则表达式 /^\s*[A-Z]+/mg 匹配的位置

    • ^ - 行首
    • \s* - 0+ 个空格
    • [A-Z]+ - 1 个或多个大写 ASCII 字母
    • /mg - 多行和全局修饰符。

    请注意,如果您想确保匹配- 后面的字母,您可以在模式末尾附加(?=-) 正向前瞻。

    请注意,您仍然需要使用.map(x =&gt; x.trim()(或.map(function(x) {return x.trim();}))修剪与\s* 匹配的所有前导空格。您也可以捕获字母([A-Z]+),然后在循环中使用RegExp#exec() 来获取match[1] 值,但这涉及更多代码。

    查看 JS 演示:

    var data = document.getElementById("data").value.match(/^\s*[A-Z]+(?=-)/mg).map(x => x.trim());
    console.log(data);
    <textarea rows="15" cols="50" id="data">
                    >1/1AA
            BBAAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            -------------
            >2/1B
            CBDAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            -------------
            >3/1-CD
            EBAAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            -------------
            >4/1-11
            FBAAAACC-------------------------------------------------------------
            ------------------------------------------------------------------------
            ------------- 
    </textarea>

    【讨论】:

      【解决方案3】:

      拥有地图和过滤器 - 另一个答案是 ES5/6,因此无法在旧版浏览器中使用:

      var array= document.getElementById("data").value
        .split("\n")
        .map(function(line) {
          line = line ? line.trim() : "";
          line = line.replace(/-/g, "");
          return line; })  
        .filter(function(line) {
          return line && line.indexOf(">") != 0;});
      console.log(array);
      <textarea rows="15" cols="50" id="data">
                  		>1/1AA
                  BBAAAACC-------------------------------------------------------------
                  ------------------------------------------------------------------------
                  -------------
                  >2/1B
                  CBDAAACC-------------------------------------------------------------
                  ------------------------------------------------------------------------
                  -------------
                  >3/1-CD
                  EBAAAACC-------------------------------------------------------------
                  ------------------------------------------------------------------------
                  -------------
                  >4/1-11
                  FBAAAACC-------------------------------------------------------------
                  ------------------------------------------------------------------------
                  ------------- 
      </textarea>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-07
        • 1970-01-01
        • 2020-08-27
        • 2011-02-07
        • 2015-01-28
        • 2021-06-20
        • 1970-01-01
        相关资源
        最近更新 更多