簡體   English   中英

正則表達式只替換一個匹配

[英]Regular expression replace only one matching

我在 JavaScript 中有一個正則表達式代碼

const regexns = /[A-Za-z]\:[A-Za-z]/gi;
data = data.replace(regexns, '__NS__');

如果我申請這個 XML

<AnchorPane prefHeight="400.0" prefWidth="600.0"
    xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="com.zigma.Controller">

我得到

<AnchorPane prefHeight="400.0" prefWidth="600.0"
    xmlns="http://javafx.com/javafx/8" xmln__NS__x="http://javafx.com/fxml/1"
    f__NS__ontroller="com.zigma.Controller">

這意味着我在以下和之前丟失了 1 個字母:

如何替換:不丟失那些邊字母,
正則表達式本身是否有任何選項,或者我們需要執行循環和條件並像這樣拆分?

預期輸出是

<AnchorPane prefHeight="400.0" prefWidth="600.0"
    xmlns="http://javafx.com/javafx/8" xmlns__NS__fx="http://javafx.com/fxml/1"
    fx__NS__controller="com.zigma.Controller">

捕獲:之前的字母,因此可以將其添加到替換中,並先行查找:之后的字母,因此不會匹配。 另請注意,由於您使用的是不區分大小寫的標志,因此無需重復[A-Za-z] ,並且不需要對冒號進行轉義:

 const data = `<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zigma.Controller"> `; console.log(data.replace(/([az]):(?=[az])/gi, '$1__NS__'));

根據您輸入的形狀,您或許可以改用單詞邊界:

 const data = `<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zigma.Controller"> `; console.log(data.replace(/\\b:\\b/gi, '__NS__'));

對於更強大的東西,我建議將字符串解析為 XML 文檔,然后遍歷文檔的元素,將包含:模式的屬性替換為新屬性。

暫無
暫無

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

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