我有一个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
简而言之,我在做什么:
- 从
<widget
到version="
的所有内容分组 - 选择除
"
之外的所有内容 - 将所有内容分组到下一个
>
。
然后,您可以将其替换为$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