【问题标题】:Regex to remove characters and supplied words正则表达式删除字符和提供的单词
【发布时间】:2013-10-30 05:31:38
【问题描述】:

我需要一个正则表达式,它只允许字母数字字符并删除某些完整的单词。

例子:

输入字符串:this-is-johny-bravo's-grand-dad

结果字符串:johny-bravos-dad

用空字符串替换的单词/字符:this,is,',grand

这是我目前所拥有的:

var input = "this-is-johny-bravo's-grand-dad";
var regex = new Regex(@"([^a-z0-9\-][\b(this|is|grand)\b]?)");
var result = regex.Replace(input, "");

结果似乎没有撇号,但不幸的是仍然包含被拒绝的完整单词。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    您还需要将字符类添加到alternation:

    new Regex(@"\b(this|is|grand)\b-?|[^a-z0-9-]");
    

    【讨论】:

    • +1 这可能更符合 OP 的意图,而不是我的意图。 :)
    • (虽然表达式中仍然存在语法错误,并且不会删除多余的破折号)
    • 看起来不错,我只需要删除多余的 ')' 括号。谢谢!
    • @Tomalak 是的,我需要对多余的破折号做点什么。
    • @Tomalak 哎呀。修复。谢谢:)
    【解决方案2】:

    你的表达方式太复杂了。试试

    \b(this|is|grand|')\b-?

    另外,这也是问题的根本原因:字符类不适合交替使用。这个[\b(this|is|grand)\b] 在语法上等同于这个[()adghinrst|]

    仔细想想,你可能想要这个:

    (\b(this|is|grand)\b|[^a-z0-9-])-?

    分解:

    ( # 第一组 \b(this|is|grand)\b # 这些词中的任何一个 | # 要么 [^a-z0-9-] # 除了其中一个字符之外的任何字符 ) # 结束组 1 -? # 最后的可选破折号

    【讨论】:

    • 字边界是否适用于'?我的意思是我不确定这一点。否则,这是一个不错的缩短版本。
    • @Rohit 是的,不小心。单词边界有两种方式,一个紧接在' 之前(单词"bravo" 的结尾),一个紧随其后(单词"s" 的开头)。但这不是 OP 的意思,所以忘记短版本并使用更长的版本。
    • 感谢解释块,它确实有助于理解语法。
    猜你喜欢
    • 2011-01-05
    • 2017-01-18
    • 2014-06-21
    • 2019-12-08
    • 1970-01-01
    • 2022-01-27
    • 2021-08-07
    • 2020-01-25
    • 1970-01-01
    相关资源
    最近更新 更多