正则表达式模式需要Java toString()方法的帮助

正则表达式模式需要Java toString()方法的帮助,java,regex,Java,Regex,我在从XML生成的代码上有一个java toString。作为一家公司,我们正在将toString()记录到日志中,我很难制作一个好的正则表达式来有效地屏蔽所有数据。 下面是要字符串的示例 String input="com.example.sensitive.info.UserInfo@15b1534[name=User1, clientName=HARVARD LAW SCHOOL, THE, clientId=12345]"; 预期产量 com.example.sen

我在从XML生成的代码上有一个java toString。作为一家公司,我们正在将toString()记录到日志中,我很难制作一个好的正则表达式来有效地屏蔽所有数据。 下面是要字符串的示例

String input="com.example.sensitive.info.UserInfo@15b1534[name=User1, clientName=HARVARD LAW SCHOOL, THE, clientId=12345]";
预期产量

com.example.sensitive.info.UserInfo@15b1534[name=User1, clientName=****************, clientId=12345]
有人能帮我用一个正则表达式来掩盖一切直到下一个相等的前一个逗号(,)吗=

这是我试过的

maskPatterns.add("clientName=(.*?)=");
这最终屏蔽到next=。我似乎不知道如何让它在下一个相等(=)之前返回到最后一个逗号(,)

如果有人有更好的正则表达式,我洗耳恭听,你可以用

clientName=(*?(=\s*,\s*\w+=\124;\]))

详细信息

  • clientName=
    -文本字符串
  • (.*)
    -第1组:除换行符以外的任何零个或多个字符,尽可能少
  • (?=\s*,\s*\w+=\code>)
    -一种积极的前瞻,需要
    ]
    \]
    )或(
    )一个两端都有零个或多个空格的逗号(
    \s*,\s*
    ),然后是一个或多个单词字符,并紧靠当前位置右侧
或者,如果您需要相同数量的星号,请使用

String result=text.replaceAll(“(\\G(?)| clientName=)。(?=*,\\s*\\w+=|\\]),“$1*”;

详细信息

  • (\\G(?)| clientName=)
  • -除换行符以外的任何字符
  • (?=.*,\s*\w+=\])
    -直到第一次出现
    • *?,\s*\w+=
      -任何零个或多个字符(尽可能少的换行字符除外)、一个逗号、零个或多个空格、一个或多个单词字符和一个
      =
    • |
      -或
    • \]
      -a
      ]
      字符
在此处使用
String#replaceAll

String input=“com.example.sensitive.info。UserInfo@15b1534[name=User1,clientName=HARVARD法学院,THE,clientId=12345]”;
字符串输出=输入.replaceAll(\\bclientName=.*(\\s*)(?=\\w+=\\]),“clientName=**************$1”);
系统输出打印项次(输入);
系统输出打印项次(输出);
这张照片是:

com.example.sensitive.info.UserInfo@15b1534[name=User1, clientName=HARVARD LAW SCHOOL, THE, clientId=12345]
com.example.sensitive.info.UserInfo@15b1534[name=User1, clientName=**************** clientId=12345]

请注意,星号的数量可能不应与
clientName
中的原始字符数量完全匹配。这样做实际上会部分显示原始内容,至少会显示
clientName
字符串的原始长度。

根据您的
掩码示例Patterns.add(“clientName=(.*?”);
我假设您想要捕获组1中的值

如果标记值结尾的方括号不可知,但您也不想匹配它们,则可以使用:

\bclientName=([^\r\n,=\[\]]+(?:,(?!\h*\w+=)[^\r\n,=\[\]]*)*)
解释

  • \bclientName=
    一个单词边界,然后匹配
    clientName=
  • Capturegroup 1
    • [^\r\n,=\[\]+
      匹配除
      =
      [
      ]
      或换行符以外的任何字符的1+倍
    • (?:
      非捕获组
      • ,(?!\h*\w+=)
        匹配一个逗号,表示直接在右边的不是0+水平空格字符、1+单词字符和一个
        =
        符号
      • [^\r\n,=\[\]]*
        可以选择匹配除换行符以外的任何字符
        =
        [
        ]
    • )*
      关闭非捕获组并重复0多次以获取所有出现的逗号
  • 关闭第1组


如果
[
]
也可以是clientName的一部分,那么您可以从字符类中删除它们。

您可能只需要使用
“clientName=([^,]*)”
“clientName=([^,=]*)”
客户端名称中有逗号,它在第一个名称之后停止。对,请使用
clientName=(.*?)(*?=\s*,\s*\w+=\)
。即使值包含
=
,它也会工作。
(?在我的例子中,它是java类的字符串,所以它最终是这样的,但是正则表达式应该是不可知的。我也喜欢你更改*号的想法,我会尝试合并它。感谢你的解释帮助我理解正则表达式如何工作的复杂性。