【问题标题】:Allow conditional usage of semicolon in regex pattern允许在正则表达式模式中有条件地使用分号
【发布时间】:2021-12-28 15:51:07
【问题描述】:

我有以下模式:

UnallowedCharacters = @"<>\{\}" + "\"";
@"^(?<contactType>\d+):(?<contactIdentifier>[^;" + UnallowedCharacters + @"]+)(;(?<parameterName>[A-Za-z0-9_-]+)=(?<parameterValue>[^;=" + UnallowedCharacters + "]+))*$"

我需要允许在contactIdentifier 部分使用分号,但仍然不能从不允许的字符中排除分号,因为以后的拆分将不再起作用。

输入和预期输出的两个示例如下:

  • 输入:"8:test;aliases=1:test@outlook.com,4:test" => 解析后,预期输出应为"8:test" for contactIdentifier 部分
  • 输入:"8.test;.person@domain.com;aliases=1:test@outlook.com,4:test" => 解析后,预期输出应为"8:test;.person@domain.com" for contactIdentifier 部分

分号用于在解析过程中将未解析的字符串拆分为多个部分,但我希望允许在contactIdentifer字符组中使用它而不影响现有的匹配和解析逻辑。

有什么想法吗?

【问题讨论】:

  • UnallowedCharacters 目前不包含分号,那么,问题解决了吗?如果没有,请发布示例输入(有效和无效)
  • 见稍后编辑。 :)
  • @MathiasR.Jessen 请参阅编辑。

标签: c# regex


【解决方案1】:

如果我理解了这个问题,你可以这样做:

UnallowedCharacters = @"<>{}"""; (no need to escape inside a character group)

(?<contactIdentifier>(?:[;]|[^" + UnallowedCharacters + @"])+

解释

我将&lt;contactIdentifier&gt; 组更改为:

?&lt;contactIdentifier&gt;名字

(?:(非捕获)组的开始

[;]|';'或者:

[^" + UnallowedCharacters + @"] 1 个字符不在班级

)+全组重复一次或多次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多