正则表达式在 xml 标记中查找属性并替换其值(node/Javascript)



我有一个Cordova配置.xml文件,我正在编写一个脚本来提升版本。该文件的示例是:

<?xml version="1.0" encoding="utf-8"?>
<widget android-packageName="com.demo.android" id="com.demo.ios" ios-CFBundleIdentifier="com.demo.ios.dev" version="1.16.6" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name short="DEMO DEV">DEMO</name>

我想替换<widget>标签内的属性version的值,但不影响任何其他属性,包括<?xml标签中的属性。

因此,简单地说,查找并替换widget标签内的属性version的值。

您可以尝试以下正则表达式并在正则表达式 101 上进行测试:

/(<widget [Ss]*?version=")[^"]+("[Ss]*?>)/gmi

简而言之,我在做什么:

  1. <widgetversion="的所有内容分组
  2. 选择除"之外的所有内容
  3. 将所有内容分组到下一个>

然后,您可以将其替换为$1(new version)$2

这是一个简单的演示:

const versionRegex = /(<widget [Ss]*?version=")[^"]+("[Ss]*?>)/gmi;
const content = `<?xml version="1.0" encoding="utf-8"?>
<widget android-packageName="com.demo.android" id="com.demo.ios" ios-CFBundleIdentifier="com.demo.ios.dev" version="1.16.6" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name short="DEMO DEV">DEMO</name>`
const newVersion = 'testVersion';
const replaced = content.replace( versionRegex, `$1${ newVersion }$2` )
document.getElementById( 'result' ).innerText = replaced;
pre {
white-space: pre-line;
}
<pre id="result"></pre>

这做你想做的:

let xml; // Your xml file
const version = "0.8.5"
xml = xml.replace(/(<widget.+version=")([0-9.]+)(".*>)/, "$1"+version+"$3")

正则表达式匹配的说明:

  • 正则表达式的第一个匹配项 ($1(:第一个字符串,以<widget开头,所有字符直到version="
  • 第二个匹配项($2,不在替换中,因为这是我们要替换的字符串(是版本号
  • 最后一个匹配项是所有字符,直到小部件属性的插入符号结束>
  • 而全球比赛就是这三场比赛加在一起

尝试

查找/<widget(?=s)(?=((?:[^>"']|"[^"]*"|'[^']*')*?sversions*=s*)(?:(['"])([Ss]*?)2)((?:"[Ss]*?"|'[Ss]*?'|[^>]*?)*?>))s+(?:"[Ss]*?"|'[Ss]*?'|[^>]*?)+>/

替换<widget$1$2NEW_VERSION$2$4

https://regex101.com/r/1KnW0M/1

(旧版本位于捕获组 3 中,以备不时之需。

更多信息

# Begin Widget tag
< widget                 
(?= s )
(?=                           # Asserttion (a pseudo atomic group)
(                             # (1 start), Up to Version attribute
(?: [^>"'] | " [^"]* " | ' [^']* ' )*?
s version s* = s* 
)                             # (1 end)
(?:
( ['"] )                      # (2), Quote
( [Ss]*? )                  # (3), Version Value
2 
)
(                             # (4 start), After Version attribute
(?: " [Ss]*? " | ' [Ss]*? ' | [^>]*? )*?
>
)                             # (4 end)
)
# Have the version, just match the rest of tag
s+ 
(?: " [Ss]*? " | ' [Ss]*? ' | [^>]*? )+
>                             # End Widget tag

最新更新