删除破折号但不是连字符

时间:2018-04-13 02:25:39

标签: c# regex

我想删除dashes之前,之后和之间的间隔词,而不是带连字符的词。

  

这是 - 一个测试句。 -Test- ---一二 - 三---四----。

应该成为:

  

这是一个测试句。测试一二 - 三---四。

删除多个短划线--- 保留多个连字符Three---Four

我试图这样做:

http://rextester.com/SXQ57185

string sentence = "This- -is - a test-sentence. -Test- --- One-Two--Three---Four----.";

string regex = @"(?<!\w)\-(?!\-)|(?<!\-)\-(?!\w)";
sentence = Regex.Replace(sentence, regex, "");

Console.WriteLine(sentence);

但输出是:

  

这是一个测试句。测试 - 一 - 二 - 三 - 。

3 个答案:

答案 0 :(得分:3)

我建议做的是结合正面回顾和积极前瞻对抗想要破折号旁边的角色。在你的情况下,这将是空格和句号。如果 后瞻或前瞻匹配,则您要删除该短划线。

这将是:In training mode, it normalizes the input by *batch statistics*. It also maintains approximated population statistics by moving averages, which can be used for instant evaluation in testing mode.

打破这个局面:

  • ((?<=[\s\.])\-+)|(\-+(?=[\s\.])) - 匹配空格或句号后的连字符
  • ((?<=[\s\.])\-+) - 或
  • | - 匹配后跟空格或句号的连字符

这是一个展示:

的JavaScript示例

(\-+(?=[\s\.])

这也可以在 Regex101 上看到。

请注意,使用此功能后,您可能还需要修剪多余的空格,这可以通过C#中的 .Trim() 来完成。

答案 1 :(得分:2)

您可以使用\b|\s执行此任务。

/(\b|\s)(-{3})(\b|\s)/g

<强> DEMO

细分从regex101.com无耻地复制:

/(\b|\s)(-{3})(\b|\s)/g

  • 第一捕获小组(\b|\s)
    • 第一替代\b
      • \b在字边界(^\w|\w$|\W\w|\w\W)
      • 处断言位置
    • 第二种选择
      • \s匹配任何空格字符(等于[\r\n\t\f\v ]
  • 第二捕获小组(-{3})
    • -{3}匹配字符 - 字面意思(区分大小写)
    • {3}量词 - 准确匹配3次
  • 第三捕获小组(\b|\s)
    • 第一替代\b
      • \b在字边界(^\w|\w$|\W\w|\w\W)
      • 处断言位置
    • 第二个替代\s
      • \s匹配任何空格字符(等于[\r\n\t\f\v ]

答案 2 :(得分:1)

您可以只匹配单词字符之间的所有连字符,并使用简单的

删除所有其他连字符
Regex.Replace(s, @"\b(-+)\b|-", "$1")

请参阅regex demo

<强>详情

  • \b(-+)\b - 字边界,后跟1 +连字符,然后是字边界(即字母,数字和下划线之间的连字符)
  • | - 或
  • - - 其他情境中的连字符(将被删除)。

请参阅C# demo

var s = "This- -is - a test-sentence. -Test- --- One-Two--Three---Four----.";
var result = Regex.Replace(s, @"\b(-+)\b|-", "$1");
Console.WriteLine(result); 
// => This is  a test-sentence. Test  One-Two--Three---Four.