【问题标题】:Regex to remove punctuation where it isn't part of the word/value so leave %, £, ', but remove , ([ *正则表达式删除不属于单词/值的标点符号,因此保留 %, £, ',但删除 , ([ *
【发布时间】:2015-01-25 16:59:36
【问题描述】:

我已经阅读了 wiki 和其他建议的材料,但我无法理解如何创建这个 Regex。

要详细说明,它是必需的,因为我需要将一个句子分成单词,并且只有单词/值,以便我可以将每个单词与其他句子中的其他单词进行比较。这意味着它的“”对于保留美元符号很重要,因为 10 美元与 10 美元不同,百分比和带有撇号的“Tom's”也是如此。使用 £$€#& 仅在后面没有空格时删除,因为 & 可用于公司名称(如 B&Q 和金钱),货币符号本身与我的需求无关。

所以应该是:删除除 £$€#&+- 之外的所有标点符号,除非后面有空格,如果前面有空格,则删除 %。

然后我会用空格分割成一个数组,它就是这个该死的正则表达式。

我有一个正则表达式白名单:

Regex.Replace(string, @"[^0-9a-zA-Z\s]+", "");

我只是不知道如何指定一个字符+空格或空格+字符,例如删除“$”但在它的“$10”时留下 $ 我知道 \s 是哪个空格但我如何附加到我不知道的正则表达式。

【问题讨论】:

  • 如果您不知道如何使用正则表达式,请使用 string.split。
  • 嗯,我想删除而不是最初拆分,并且拥有 1 个正则表达式将比我需要的 10 个左右单独的 string.removes 更好。此外,我宁愿不只是满足于一种凌乱的方法,因为人们不想提供帮助,就像这个网站不是为了寻求帮助......
  • 如果您甚至无法向我们提供您如何尝试自己完成它的示例(至少删除 % 前面带有空格的部分),我们无法相信您在询问之前实际上尝试了某些东西.如果你不愿意花时间去做,你也不能指望我们去做。用空字符串替换/ %/ 并不难;或查找字符范围,然后对空间执行lookahead 并再次替换。所以请去尝试更多,向我们提供你所做的,然后我们可以真正帮助你:)
  • 我有一个 a-zA-Z-0-9 的基本正则表达式白名单,但仅此而已,我已经编辑了我的问题以显示这一点。

标签: c# regex string split punctuation


【解决方案1】:

@Tom,你当然可以使用正则表达式,这是一个答案

好吧,我最初想删除不拆分,并且拥有 1 个正则表达式将比我需要的 10 个左右单独的 string.removes 更好。此外,我宁愿不只是满足于一种凌乱的方法,因为人们不想提供帮助,就像这个网站不是为了寻求帮助而提出问题......

以及如何使用 String.Split 来完成(如果它更短,我会将其作为评论发布)

var symbols = "£$€#&%+-";
var punctuationsChars =  Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)
                            .Select(i => (char)i)
                            .Where(c => char.IsPunctuation(c))
                            .Except(symbols)
                            .ToArray();

string input = "leave £10 remove £ and leave 10% remove % ok";

var parts = input.Split(punctuationsChars)
                 .SelectMany(x => x.Split())
                 .Where(x => !(x.Length == 1 && symbols.Contains(x[0])))
                 .ToList();

所以,如果你不知道如何使用它,你不必使用正则表达式。

输出:leave £10 remove and leave 10% remove ok

【讨论】:

  • 我不知道我能说多少,我需要删除诸如 £、$ 之类的符号,仅当其后跟一个空格时,例如:“留下 £10 删除 £ 并留下 10% 删除 % ok ”,应该会导致“留下 10 英镑删除并留下 10% 但删除 ok”我认为除非使用正则表达式或一英里长的字符串,否则不能指定这些条件。删除“£”、“$”、“&”等.
  • @Tom I need to remove symbols such as £, $ ONLY if its followed by a SPACE 要么你没有测试代码,要么你仍然明白我的意思。当您的 char 是找到的字符串中唯一的 char 时,您只需要一个简单的 where 进行过滤。
  • 是的,测试了它,没有按照我说的那样做,没有在哪里指定条件,除非后面有空格,它所做的只是列出不删除的符号。
  • @Tom 我用你的简单要求更新了它。有趣的是,您没有尝试理解发布的代码,而只是想要一个交钥匙解决方案。您是软件开发人员还是只想尽快完成作业的学生。
【解决方案2】:

您不需要正则表达式来执行此操作:

var newStr = new string(originalStr.Where(c => !",([*\"".Contains(c)).ToArray());

【讨论】:

  • 不错啊,没见过这个方法,怎么在字符后面指定空格?所以说删除“£”
  • 将其添加到您要在Where 子句中删除的字符中:var newStr = new string(originalStr.Where(c => !" ,([*\"".Contains(c)).ToArray());
  • 对不起,我不明白,在任何字符后添加一个空格只会删除字符串中的所有空格,而不仅仅是该字符+空格出现的位置。例句“这个符号 £ 应该被删除,但这个 £10 不应该”
  • 我的错 - 如果你想有条件地删除字符,最好使用正则表达式,但至少你在这里有一个起始选项
  • 我有一个 a-zA-Z0-9 的正则表达式白名单,它只是弄清楚如何指定符号+空格
猜你喜欢
  • 2022-07-21
  • 1970-01-01
  • 2014-06-20
  • 2014-05-12
  • 1970-01-01
  • 2020-02-14
  • 2015-10-25
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多