簡體   English   中英

如何避免重復以下替換代碼?

[英]How to avoid repeating the following replace code?

這是輸入:

[ 'markdown',
  [ 'para', '"a paragraph"' ],
  [ 'hr' ],
  [ 'para', '\'another paragraph\'' ],
  [ 'bulletlist', [ 'listitem', '"a list item"' ] ] ]

以下代碼循環遍歷數組的每個元素。 如果元素是另一個數組,則代碼會進一步深入並應用replace ,如果不是,它將立即應用replace (如果我不知道在數組上執行if replace會導致錯誤。

  for (i = 1; i < tree.length; i++) {
    var node = tree[i]
    var x = node.length - 1
    var y = node[x].length - 1

    if (Array.isArray(node[x])) {
      node[x] = node[x][y].replace(/"(?=\b)/g, '“')
                          .replace(/"(?!\b)/g, "”")
    } else {
      node[x] = node[x].replace(/"(?=\b)/g, '“')
                       .replace(/"(?!\b)/g, "”")
    }
  }

困擾我的是與replace的重復。 我該如何修改代碼,以便只執行一次.replace(/"(?=\\b)/g, '“').replace(/"(?!\\b)/g, "”")一次?

提取函數中的邏輯:

   function replaceMe(element) {
        return element.replace(/"(?=\b)/g, '“')
                      .replace(/"(?!\b)/g, "”");
    }


...
  for (i = 1; i < tree.length; i++) {
    var node = tree[i]
    var x = node.length - 1
    var y = node[x].length - 1

    if (Array.isArray(node[x])) {
      node[x] = replaceMe(node[x][y]);
    } else {
      node[x] = replaceMe(node[x]);
    }
  }
...

使用迭代,對N維數組有效

function doWork(tree){
  for (i = 1; i < tree.length; i++) {
    var node = tree[i]
    var x = node.length - 1
    var y = node[x].length - 1

    if (Array.isArray(node[x])) {
      doWork(node[x]);
    } else {
      node[x] = node[x].replace(/"(?=\b)/g, '“')
                       .replace(/"(?!\b)/g, "”")
    }
  }
}

// use it
doWork(tree);

有時,兩個簡單的正則表達式比一個復雜的正則表達式快。

但是您可以嘗試使用其他方法,例如:

var example_string = '"some_string"',
    regex = /"(.*?)"/g;

var result = example_string.replace(regex, "“$1”");

console.log(result); // “some_string”

```

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM