我很难理解正则表达式。我有一个场景,其中有效字符是a-z,A-Z,0-9和空格。因此,当我尝试为无效字符创建一个RegEx时,我有这个,[^ a-zA-Z0-9]。 然后我有基于RegEx搜索的字符串,当它找到无效字符时,它会检查它前面的字符是否无效。 例如,“测试测试+?测试” 所以我想要发生的是,如果有两个无效字符,一个接一个,不做任何其他事情,否则插入'£'。所以上面的字符串会很好,没有变化。但是,字符串“test test£test”应更改为“test test test test”。
这是我的代码..
public string HandleInvalidChars(string message)
{
const string methodName = "HandleInvalidChars";
Regex specialChars = new Regex("[^a-zA-Z0-9 ]");
string strSpecialChars = specialChars.ToString();
//prev character in string which we are going to check
string prevChar;
Match match = specialChars.Match(message);
while (match.Success)
{
//get position of special character
int position = match.Index;
// get character before special character
prevChar = message.Substring(position - 1, 1);
//check if next character is a special character, if not insert ? escape character
try
{
if (!Regex.IsMatch(prevChar, strSpecialChars))
{
message = message.Insert(position, "?");
}
}
catch (Exception ex)
{
_logger.ErrorFormat("{0}: ApplicationException: {1}", methodName, ex);
return message;
}
match = match.NextMatch();
//loop through remainder of string until last character
}
return message;
}
当我在第一个字符串上测试时,它会处理第一个无效的字符“+”,确定但是当它达到“£”时它就会崩溃。
非常感谢任何帮助。
谢谢:)
答案 0 :(得分:0)
如果您将RegEx更改为如下所示,仅检查具有一个特殊字符但不包含两个特殊字符的情况会怎样?
[a-zA-Z0-9 ]{0,1}[^a-zA-Z0-9 ][a-zA-Z0-9 ]{0,1}
另一件事,我会为返回值创建一个新变量。我可以看到你一直在改变你正在寻找火柴的原始字符串。
答案 1 :(得分:0)
我相信你有点过分了。您所需要的只是找到一个禁止使用的字符,该字符串不在其他禁止字符之前或后面。
声明
public string HandleInvalidChars(string message)
{
var pat = @"(?<![^A-Za-z0-9 ])[^A-Za-z0-9 ](?![^A-Za-z0-9 ])";
return Regex.Replace(message, pat, "£$&");
}
并使用:
Console.WriteLine(HandleInvalidChars("test test £test"));
// => test test ££test
Console.WriteLine(HandleInvalidChars("test test +?test"));
// => test test +?test
请参阅online C# demo。
<强>详情
(?<![^A-Za-z0-9 ])
- 如果在当前位置的左侧有一个除ASCII字母/数字或空格以外的字符,则会导致匹配失败的负面观察[^A-Za-z0-9 ]
- ASCII字母/数字或空格以外的字符(?![^A-Za-z0-9 ])
- 如果在当前位置右侧有一个除ASCII字母/数字或空格以外的字符,则会导致匹配失败的否定前瞻。替换字符串包含$&
,对整个匹配值的反向引用。因此,使用"£$&"
我们会在匹配前插入£
。
请参阅regex demo。