Java 中的正则表达式模式匹配 toString()

发布时间:2021-03-08 15:51

我正在寻找匹配字符串模式的帮助(tostring() 生成):

MyObject{nothingSpecial='Word1', secretData='Word2', privateEmail='Word3'}

我想要一个可以匹配 Word1、Word3 的模式。所以我想出了:

(?x)(["]?(nothingSpecial|secretData)["]?\s*[:=]{1}\s*["]?)(?:[^"\n,]+)

那行得通,但现在我需要加强它,以便我也可以匹配对象名称,例如MyObject

示例:

  1. 不匹配,因为它不是 MyObject:YourObject{nothingSpecial='Word1', secretData='Word2', privateEmail='Word3'}

  2. 与 MyObject 匹配,因此查找 nothingSpecial 和 privateEmail:MyObject { nothingSpecial='Word1', secretData='Word2', privateEmail=' Word3'}

  3. 不匹配,因为它不是 MyObject:TheirObject{nothingSpecial='Word1', secretData='Word2', privateEmail='Word3'}

说实话,我从来都不是一个出色的 RegEx,因此非常感谢您的帮助。

回答1

要匹配 3 个单词,您可以使用 if \G

(?:\b(MyObject)\h*\{\h*(?=[^{}]*})|\G(?!^))(?:(?:nothingSpecial|privateEmail)='([^'\n,]+)'|[^\s=]+='[^'\n,]*')(?:,\h*)?

Regex demo | Java demo

  • (?: 非捕获组
    • \b(MyObject)\h*\{\h*group 1 中捕获 MyObject 并匹配 {
    • (?=[^{}]*})
    • |
    • \G(?!^) 断言上一场比赛结束时的位置
  • ) 关闭非捕获组
  • (?: 非捕获组
    • (?:nothingSpecial|privateEmail)= 匹配 nothingSpecialprivateEmail 后跟 =
    • '([^'\n,]+)' 捕获 group 2 匹配除 ' 单引号之间的换行符或逗号以外的任何字符
    • |
    • [^\s=]+='[^'\n,]*' 用单引号匹配键值对
  • ) 关闭非捕获组
  • (?:,\h*)? (可选)匹配逗号和水平空白字符