正则表达式获取匹配项(不包括模式)

时间:2019-03-11 10:23:18

标签: c# regex

我正在尝试创建一个正则表达式,它将返回字符串中的所有特殊字符,但空格之前/之后的字符除外。它还应排除最终句号。

例如

  • 你好!这是一个测试。有一场比赛。
  • 这应该!!!!匹配。
  • 这不是匹配项。特殊字符后有一个空格。

我正在尝试这样做,但这不是我所需要的。

[^a-zA-z0-9\s](?!(\s[^a-zA-z0-9]|[^a-zA-z0-9]\s))

1 个答案:

答案 0 :(得分:1)

这似乎可以解决问题:

(?<!\s)\p{P}(?!\s)(?!$)

那是

  • (?<!\s):后向否定,断言我们没有出现在空格之后
  • \p{P}:要匹配的标点符号(这是Unicode标点符号的常规类别)
  • (?!\s):前瞻性否定,断言我们不在空白之前出现
  • (?!$):另一个否定的前瞻性,断言我们没有出现在文件末尾之前

您也可以在没有环视断言的情况下执行此操作,而是使用捕获组来提取标点符号:

(?:[^\s]|^)(\p{P})[^\s$]

我添加了一个测试,该测试与字符串的开头匹配,以在标点字符作为字符串的第一个字符出现时保持与第一个正则表达式相同的行为。您的问题未在此处指定行为。