【问题标题】:How to use Regex.Replace in this situation?在这种情况下如何使用 Regex.Replace?
【发布时间】:2013-02-25 19:15:30
【问题描述】:

我使用正则表达式检查字符串的正确性(我想允许字符 A-Z,a-z,*,space,-,&,%,@ 987654328@,/,+)。我的代码是这样的:

Regex r = new Regex("^[A-Z0-9.$/+%\\- ]+$");
string myString = "ABCDEFGH 12345 $%...     A"; //string ok

if (r.IsMatch(myString))
  System.Console.WriteLine("String alright!");

这是有效的,一切都很好。现在我只是想,也许我也可以处理不正确的字符串。我想用- 替换字符串中的不正确(非正则表达式有效)字符。这可以通过Regex.Replace 完成。所以我做了这个:

Regex r = new Regex("^[A-Z0-9.$/+%\\- ]+$");
string myString = "HELLO WÖRLD ß~# 50.00$"; //Ö,ß,~,# should be replaced by -

if (r.IsMatch(myString))
  System.Console.WriteLine("String alright!");
else
  myString = Regex.Replace(myString, r.ToString(), "-");

System.Console.WriteLine(myString);

好吧,这是行不通的!作为输出我得到:

HELLO WÖRLD ß~# 50.00$

我错过了什么?问题是正则表达式对吗?我可以检查一个字符串是否正确,但我不能正确使用这个正则表达式 Regex.Replace 函数。有没有办法使用 1 个正则表达式来检查字符串是否有效并使用 Regex.Replace

【问题讨论】:

    标签: c# .net regex replace


    【解决方案1】:

    如果您想(匹配和)替换与验证表达式中的字符不匹配的字符,您需要另一个表达式来专门匹配这些字符。例如:

    [^A-Z0-9.$/+%\- ]
    

    可以用作:

    myString = Regex.Replace(myString, @"[^A-Z0-9.$/+%\- ]", "-");
    

    【讨论】:

    • 啊好吧。可能我不完全理解你的正则表达式和我的正则表达式之间的区别......但是这个正在工作。在此之后我唯一需要更改的是我的 if 声明为 '(!r.IsMatch(myString))' 然后一切都很好。谢谢!
    【解决方案2】:

    您的代码实际上没有意义。
    如果r.IsMatch() 返回false,您就知道正则表达式与字符串不匹配,因此替换任何匹配项都不会产生效果。 (没有匹配项)

    相反,您应该创建一个匹配任何无效字符的正则表达式,检查它是否匹配,如果匹配,则调用.Replace()


    另外,你在滥用正则表达式。

    如果你有一个Regex 实例,你应该调用它的Replace instance 方法:

    myString = r.Replace(myString, "-");
    

    【讨论】:

      【解决方案3】:

      您的替换没有发生,因为正则表达式没有找到要替换的内容。

      要使用相同的正则表达式,您可以做的是将“myString”转换为字符并检查每个字符的有效性。

      示例(来自 java,但应该很容易理解):

      if (r.IsMatch(myString)){
                  System.Console.WriteLine("String alright!");
      }  else {
      
          // java iteration
          for(int i = 0; i < myString.length(); i++){
              Character c = myString.charAt(i);
              if(!c.toString().matches(reg)){
                  myString = myString.replace(c.toString(), "-");
              }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 2015-11-30
        • 2017-05-16
        • 2012-10-06
        • 2011-05-18
        • 2019-11-29
        • 2022-01-23
        • 2018-05-20
        • 1970-01-01
        相关资源
        最近更新 更多