首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除非看到foo,否则什么都拿去

除非看到foo,否则什么都拿去
EN

Stack Overflow用户
提问于 2014-09-06 17:17:06
回答 3查看 60关注 0票数 0

学习Regex。

我想匹配所有的东西,除非它看到foo

输入:

代码语言:javascript
复制
take everything 1 foo take everything 2 foo take everything 3
take everything 4

Expect:

代码语言:javascript
复制
match 1 : `take everything 1 `
match 2 : ` take everything 2 `
match 3 : ` take everything 3 `
match 4 : `take everything 4`

尝试:

  1. ([^foo]*) http://regex101.com/r/rT0wU0/1 结果: 匹配1:take everything 1 匹配2-4,6-8,10: 匹配5:take everything 2 匹配9:take everything 3 take everything 4
  2. (.*(?!foo)) http://regex101.com/r/hL4gP7/1 结果: 匹配1:take everything 1 foo take everything 2 foo take everything 3 匹配2,3: 匹配4:take everything 4

请指点我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-06 17:24:38

将单词边界\b与否定的“前瞻性”结合使用。

代码语言:javascript
复制
\b(?:(?!foo).)+

示例:

代码语言:javascript
复制
String s = @"take everything 1 foo take everything 2 foo take everything 3
take everything 4";

foreach (Match m in Regex.Matches(s, @"\b(?:(?!foo).)+"))
         Console.WriteLine(m.Value.Trim());

输出

代码语言:javascript
复制
take everything 1
take everything 2
take everything 3
take everything 4
票数 2
EN

Stack Overflow用户

发布于 2014-09-06 17:24:29

你可以试试下面的正则表达式,

代码语言:javascript
复制
(?<=foo|^)(.*?)(?=foo|$)

演示

  • (?<=foo|^)查找foo或行的开头。
  • (.*?)匹配到字符串foo或行尾的所有内容。
票数 1
EN

Stack Overflow用户

发布于 2014-09-06 17:28:30

代码语言:javascript
复制
string input = @"take everything 1 foo take everything 2 foo take everything 3
take everything 4";

var result = Regex.Matches(input, @"(.+?)((?>foo)|(?>$))", RegexOptions.Multiline)
                    .Cast<Match>()
                    .Select(m => m.Groups[1].Value.Trim())
                    .ToList();

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25702805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档