2

如果连字符两边都没有被数字包围,我想用空格替换连字符。

 string str = "Hefer 789-567 dfg-5mh";
            str = Regex.Replace(str, @"[a-zA-Z]\-(\d+)", "$1");

输出

赫弗 789-567 df5mh

期望的输出

Hefer 789-567 dfg 5mh

4

2 回答 2

4

您可以使用否定的lookahead 和lookbehind:(?<!\d)-|-(?!\d)说“匹配a-前面没有a\d或a-后面没有a \d”。

因此,您的正则表达式将类似于

string str = "Hefer 789-567 dfg-5gh";
str = Regex.Replace(str, @"(?<!\d)-|-(?!\d)", " ");

编辑:请注意,这也会替换字符串开头或结尾的连字符。如果你想避免这种情况,你可以使用(?<!\d|^)-(?=.)|(?<=.)-(?!\d|$)or (?<=[^\d])-(?=.)|(?<=.)-(?=[^\d])

于 2012-11-20T09:27:11.143 回答
3

您在标题中描述的问题可以使用以下方法解决:

Regex.Replace(str, @"(?<=[A-Za-z])-", " ");

您在问题正文中描述的问题可以使用以下方法解决:

Regex.Replace(str, @"(?<!\d)-|-(?!\d)", " ");

或者没有环视:

Regex.Replace(str, @"([^\d])-|-([^\d])", "$1 $2");
于 2012-11-20T09:33:30.327 回答