【问题标题】:C# string manipulation by rules using regex使用正则表达式通过规则进行 C# 字符串操作
【发布时间】:2011-12-16 11:39:39
【问题描述】:

我有一个情况..
有一个可以包含数字、字母和一些符号的字符串,我想从中提取或根据一些“规则”进行一些替换。 我最好是给出一些可能的情况的例子以及我想要做什么(展示):

String           Display1   or  Display2

AB_X345           X345         or  ###X345  
AB_1234            1234        or  ###1234  
X987_TEXT_4567    X9874567     or  X987######4567  
X987TEXT4567      X9874567     or  X987####4567  
X798TEXT          X798         or  X798####  
789TEXT            789         or  789####  
X400              X400         or  X400   

所以实际上,当我找到一个 X 后跟数字时,我想显示它们。如果出现一些文本,我不希望它显示,或者我希望它用字符 (#) 掩盖。 如果没有 X,我只想显示数字。 正则表达式是最简单的方法吗? (我不熟悉正则表达式 - 只是鸟瞰它)。 可以将所有规则收集在一个正则表达式中还是太复杂?

感谢您的建议

【问题讨论】:

  • 1234789 之前的空格是从哪里来的?
  • 空格没有semnification :) 对不起..我只是想更好地看到没有X。关于你指出的情况,这不会出现.. :)

标签: c# regex string replace mask


【解决方案1】:

这很简单:

resultString = Regex.Replace(subjectString, 
    @"\D       # Match a non-digit character
    (?<!       # unless...
     X         #  it's an X
     (?=\d)    #  which is followed by a digit.
    )          # End of lookbehind", 
    "", RegexOptions.IgnorePatternWhitespace);

将最后一行改为

    "#", RegexOptions.IgnorePatternWhitespace);

# 屏蔽字符而不是删除它们。

【讨论】:

  • 鉴于他的例子(TEXT这个词的使用)我会说LEX12340=>1234而不是X1234。你正在用这个正则表达式捕捉非欧洲数字。
  • @stema 判断一个正则表达式是对是错几乎比编写它更困难。 :-)
  • 谢谢你们,今晚我会尝试所有的解决方案,并标记一个会更好的解决方案。 :)
  • @stema:嗯,在TEXT 中,X 后面没有数字,所以它被删除了。
  • 我承认我没有很好地理解这个问题,但我很确定这和(?!X\d)\D一样。
【解决方案2】:

试试这个正则表达式:

X\d|\d

/X\d|\d/g

这将只选择数字或以 'X'

开头的数字

【讨论】:

    【解决方案3】:

    在显示器 1 上试试这个:@"(?&lt;![A-Za-z])X[0-9]+|[0-9]+"

    var rx = new Regex(@"(?<![A-Za-z])X[0-9]+|[0-9]+");
    var matches = rx.Matches("X987_TEXT_4567");
    
    var result = "";
    
    foreach (Match match in matches)
    {
        result += match.Value;
    }
    

    在 C# 4.0 下你甚至可以这样做

    var rx = new Regex(@"(?<![A-Za-z])(?<1>X[0-9]+)?(?:(?:[^0-9]*)(?<1>[0-9]+))*");
    var match = rx.Match("X987_TEXT_4567_123");
    var res = string.Concat(match.Groups[1].Captures.OfType<Capture>().Select(p => p.Value));
    

    但是此时的正则表达式变得有点不可读:-)

    【讨论】:

    • @stema 将其更改为零宽度负后视
    • 也不错的解决方案 ;) 感谢您也提供 C# 4.0 的版本,但我只有 3.5 :)
    【解决方案4】:

    试试这个,检查下面的例子并测试它。

    \d?X[0-9]+|[0-9]
    

    示例:
    http://rubular.com/r/cA5Y49pCtV

    【讨论】:

    • 您在此处提供的链接非常方便 :) 谢谢!我还发现了一些用于正则表达式检查的工具,但这是最简单的:)
    • 没问题很高兴能帮到你。
    猜你喜欢
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2011-04-06
    相关资源
    最近更新 更多