按c#中的字符限制正则表达式

本文关键字:正则表达式 字符 | 更新日期: 2023-09-27 18:27:46

我得到以下模式('s'w+),我需要用空格匹配字符串中的每个单词。

例如

当我有这个字符串

many word in the textarea must be happy

我得到

 many     
 word    
 in    
 the    
 textarea    
 must    
 be    
 happy

这是正确的,但当我有另一个字符时,例如

many word in the textarea , must be happy

我得到

 many     
 word    
 in    
 the    
 textarea    
 must    
 be    
 happy

但是must be happy应该被忽略,因为我希望它在字符串中有另一个字符时中断

编辑:

示例2

all cats  { in } the world are nice

应返回

all
cats

因为{是我的另一个分隔符

示例3

My 3 cats are ... funny

应返回

My
3
cats
are

因为3是字母数字,而.是我的分隔符

我能做什么?

按c#中的字符限制正则表达式

要做到这一点,您需要使用与字符串开头或最后一个匹配之后的位置匹配的'G锚点。所以你可以用这个模式:

@"(?<='G's*)'w+"
[^'w's'n].*$|('w+'s+)

试试这个。抓住捕获的或匹配的。请参阅演示。为多行模式设置标志m

请参阅演示。

http://regex101.com/r/kP4pZ2/12

我认为Sam I Am的注释是正确的:您需要两个正则表达式。

  1. 捕获不超过一个非单词字符的文本
  2. 用一侧的空格捕获所有单词

这是相应的代码:

  1. "^(''w+''s+)+"
  2. "(''w+''s+)"

你可以很容易地将这两者结合起来,只捕获单个单词——就像一样

"^(''w+''s+)+"

下面是一段完整的代码来演示模式:

string input = "many word in the textarea , must be happy";
string pattern = "^(''w+''s+)+";
Match match = Regex.Match(input , pattern);
// Never returns a NullReferenceException because of GroupsCollection array indexer - check it out!
foreach(Capture capture in match.Groups[1].Captures)
{
    Console.WriteLine(capture.Value);
}

编辑

查看Casimir et Hippolyte,获得一个非常干净的答案。

All-in-one regex:-)结果在list

Regex regex = new Regex(@"^(('w+)'s*)+([^'w's]|$).*");
Match m = regex.Match(inputString);
if(m.Success)
{
    List<string> list = 
        m.Groups[2].Captures.Cast<Capture>().
        Select(c=>c.Value).ToList();
}