我有一个Cordova config.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>
我想替换version
标记内的属性<widget>
的值,但不影响所有其他属性,包括<?xml
标记内的属性。< / p>
因此,只需放置,查找并替换version
标记内的属性widget
的值即可。
答案 0 :(得分:1)
您可以尝试以下正则表达式并在regex101上进行测试:
/(<widget [\S\s]*?version=")[^"]+("[\S\s]*?>)/gmi
简而言之,我在做什么:
<widget
到version="
的所有内容分组"
以外的所有内容>
。然后可以将其替换为$1(new version)$2
。
这是一个简单的演示:
const versionRegex = /(<widget [\S\s]*?version=")[^"]+("[\S\s]*?>)/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>
答案 1 :(得分:1)
这就是你想要的:
let xml; // Your xml file
const version = "0.8.5"
xml = xml.replace(/(<widget.+version=")([0-9\.]+)(".*>)/, "$1"+version+"$3")
正则表达式匹配的说明:
$1
)的第一个匹配项:第一个字符串,以<widget
开头,带有所有字符,直到version="
$2
,不在替换中,因为这是我们要替换的字符串)是版本号>
。答案 2 :(得分:0)
尝试
找到/<widget(?=\s)(?=((?:[^>"']|"[^"]*"|'[^']*')*?\sversion\s*=\s*)(?:(['"])([\S\s]*?)\2)((?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)*?>))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>/
替换<widget$1$2NEW_VERSION$2$4
https://regex101.com/r/1KnW0M/1
(如果需要,旧版本在Capture Group 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
( [\S\s]*? ) # (3), Version Value
\2
)
( # (4 start), After Version attribute
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )*?
>
) # (4 end)
)
# Have the version, just match the rest of tag
\s+
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
> # End Widget tag