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

时间:2018-10-16 18:58:04

标签: javascript regex

我有一个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的值即可。

3 个答案:

答案 0 :(得分:1)

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

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

简而言之,我在做什么:

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

然后可以将其替换为$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