【问题标题】:return content between `And ` keyword using regex使用正则表达式返回`和`关键字之间的内容
【发布时间】:2019-11-23 22:48:33
【问题描述】:

我需要用and 操作数(最后是Or)分割一个字符串,但我不知道该怎么做。

例如,如果我有以下字符串

Name contains 'al' and Country equals 'US|UK|FR' and Status equals 'Open|Closed'

我想取回一个包含以下内容的数组:

[0]Name contains 'al' 
[1]Country equals 'US|UK|FR'
[2]Status equals 'Open|Closed'

如果我只有Name contains 'al' 而没有任何and,它应该只返回提供的字符串

[0]Name contains 'al'

我尝试过一些简单的事情,例如:

  1. (and) 但这只返回 and 而不是内容。
  2. (?<=and)(.*)(?=and) 但这会返回第二个的内容,不包括第一个或最后一个。
  3. \b(and ) 但同样,这只会返回,我不明白为什么如果我在 and 前面包含一个空格,如果找不到任何实例。
  4. .*(\b(and)) 但这会跳过第一个 and 并将内容一直返回到第二个 and

你能帮忙吗?

谢谢

注意:这将用于 .net 2019 项目。

【问题讨论】:

  • 也许s.Split(new[] {"and", "or"}, StringSplitOptions.RemoveEmptyEntries) 可以吗?好吧,你也可以试试Regex.Split(s, @"(?i)\s*\b(?:and|or)\b\s*")
  • @WiktorStribiżew 我不敢相信我没有早点想到这个!当我应该考虑已经很容易获得的东西时,我只是坚持使用 RegEx 的想法!拆分成功了!谢谢。顺便说一句,可能想坚持这个答案。
  • @WiktorStribiżew 哦,顺便说一句,你的 RegEx 也很有魅力 :)

标签: c# .net regex regex-group


【解决方案1】:

如果您只需要拆分 andor 子字符串,请使用 String.Split

var results = s.Split(new[] {"and", "or"}, StringSplitOptions.RemoveEmptyEntries);

如果您需要将orand 拆分为整个单词,则需要Regex.Split

var results = Regex.Split(s, @"\s*\b(?:and|or)\b\s*");

这里,

  • \s* - 0+ 个空格
  • \b - 确保单词从这里开始
  • (?:and|or) - 匹配 andor 子字符串的非捕获组
  • \b - 词尾
  • \s* - 0+ 个空格。

如果您需要区分大小写,请使用(?i) 内联修饰符或RegexOptions.IgnoreCase

var results = Regex.Split(s, @"(?i)\s*\b(?:and|or)\b\s*");
var results = Regex.Split(s, @"\s*\b(?:and|or)\b\s*", RegexOptions.IgnoreCase);

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2017-07-15
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多