问题描述
我有一个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(/([a-z]):(?=[a-z])/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文档,然后遍历文档的元素,用新属性替换包含:
模式的属性。