正则表达式捕获组和使用OR语句

3

我正在尝试创建一个正则表达式,它有多个由|(或)分隔的条件。我想使用捕获组,但我还没有完全搞清楚它怎么工作。

3个样本字符串:

--- {source-charset: '', encoding-error-limit: '', class: stat-direct, directory: \\\myserver\C\FOLDER\SUB_FOLDER}  
--- {odbc-connect-string-extras: '', server: hello.sample.com, dbname: X_DB, port: '80', class: hello, username: USERX}  
--- {cleaning: 'no', filename: //myserver/D/FOLDER/SUB_FOLDER/File name.xlsx, dataRefreshTime: '', interpretationMode: '0'}

我希望每个样本字符串都能够返回正则表达式:

\\\myserver\C\FOLDER\SUB_FOLDER  
X_DB  
//myserver/D/FOLDER/SUB_FOLDER/File name.xlsx

基本上,在directory:dbname:filename:后面的值,并以}(其中一个)或,(两个)结束。

我成功地使用了OR语句来满足这三个条件。正则表达式提取。

'directory: [^}]+|dbname: [^,]+|filename: [^,]+'

这将返回:

directory: \\\myserver\C\FOLDER\SUB_FOLDER}  
dbname: X__DB,  
filename: //myserver/D/FOLDER/SUB_FOLDER/File name.xlsx,

如果我引入捕获组,我只能得到一个部分的正确返回: 'directory: ([^}]+)|dbname: ([^,]+)|filename: ([^,]+)' 这将返回:
\\\myserver\C\FOLDER\SUB_FOLDER  
null  
null  

我已经成功使用嵌套正则表达式使其工作,该正则表达式获取了

的结果。

'directory: [^}]+|dbname: [^,]+|filename: [^,]+'   

并使用:

': ([^,}]+)'

这个方法可以得到我想要的结果,但我希望用一个正则表达式完成。 非常感谢您的帮助。

/Aron

1个回答

3
您可以使用否定字符类来匹配不是{}或逗号的内容,使用非捕获组中的任何选项,并使用单个捕获组来捕获值:
{[^{]+(?:filename|directory|dbname): ([^,}]+)[^}]*}

解释

  • { 匹配 {
  • [^{]+ 使用否定字符类匹配 1 次或多次非 {
  • (?:filename|directory|dbname): 匹配任意列出的选项后跟 : 和一个空格
  • ( 捕获组 1
    • [^,}]+ 匹配 1 次或多次非 ,}
  • ) 结束捕获组 1
  • [^}]*} 匹配 0 次或多次非 },然后匹配 }

正则表达式演示


1
非常好,运行得很顺利。非常感谢。还有感谢您提供的逐步指导! - Aron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接