【问题标题】:Align space and punctuation with one regex用一个正则表达式对齐空格和标点符号
【发布时间】:2018-10-16 11:30:24
【问题描述】:

我有几个字符串,例如:

test
test. hi
test,  hello.(actual whitespace)
hello -this is a test
hello v2 , i am a " test" as well

我想按照一些规则来对齐标点符号,例如:

  1. 逗号应该有一个尾随空格,但不能有一个前导
  2. 如果原始字符串的任何一侧至少有一个空格,则连字符的两边都应该有空格
  3. 当点位于字符串末尾时,除了大​​小写之外,应该有 s 尾随空格
  4. 引号(单引号和双引号)在开/关边不应有空格
  5. etc etc(其他规则将根据需要添加,在这种情况下覆盖前 4 条就足够了)

所以输出会是这样的:

test
test. hi
test, hello.
hello - this is a test
hello v2, i am a "test" as well

我的问题是:是否有可能一次性完成 - 使用单个正则表达式而不是为每种情况创建一个正则表达式,如果是的话 - 可以做到这一点的正则表达式是什么?有没有比单个正则表达式更有效的方法(如果可能的话),特别是考虑到我已经在遍历整个字符串以删除一些特殊的 unicode 字符这一事实?

【问题讨论】:

  • 我对你的回答的看法:是的,是的
  • 请避免要求社区为您完成工作,而不是提出有效的编程问题。
  • 我们无法根据“等”来回答,请更具体一些。
  • this etc 表明还会有其他规则,我会根据需要添加它们,只需涵盖前 4 个的通用技术就足够了
  • 规则 4 对于正则表达式来说不是很简单。你如何区分打开和关闭?

标签: c# .net regex string


【解决方案1】:

使用Regex.ReplaceMatchEvaluatordelegate版本,您可以使用Regex查找有问题的标点符号,然后使用条件逻辑返回正确的结果。这不处理规则 4 - 识别正则表达式中的左引号和右引号并不容易。

List<String> src;
var p = new Regex(@"\s*,\s*|\s+-\s*|-\s+|\s*\.\s+(?=.)", RegexOptions.Compiled);
var ans = src.Select(s => p.Replace(s, m => {
            var mv = m.Value.Trim();
            return mv == "," ? ", " : mv == "-" ? " - " : mv == "." ? ". " : mv;
        })).ToList();

【讨论】:

  • 仍然是技术方面的帮助,谢谢
猜你喜欢
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 2020-09-12
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多