2013-03-11 146 views
1

需要RegEx帮助。使用C#。使用括号分割字符串的正则表达式

圆括号中的单词组(圆形或方框或卷曲)应视为一个单词。该部分位于括号外,应根据空格“'进行分割。

A)测试用例 -

输入 - Andrew. (The Great Musician) John Smith-Lt.Gen3rd

结果字符串(数组) -
安德鲁。
2.伟大的音乐家
约翰
4.史密斯Lt.Gen3rd

B)测试案例 -

输入 - Andrew. John

结果字符串(数组) -
安德鲁。
2.约翰

C)测试用例 -

输入 - Andrew {The Great} Pirate

结果字符串(数组) -
安德鲁
2.大
3.海盗

输入是一个人或任何其他实体的名称。目前的系统是非常古老的写在Access中。他们通过逐字扫描来完成它。我用C#替换它。

我认为这样做分两步 - 第一个圆括号拆分,然后分词。

我想扔这种情况下出坏输入 -

  1. 只有起点或终点可用括号

  2. 嵌套的括号

总体来说,我想拆分仅好形成(如果开始括号存在,则必须有结尾)仅限输入。

+0

由于圆括号可以嵌套,正则表达式是该作业的错误工具。你必须写一个解析器。 – 2013-03-11 21:22:21

+0

这并非完全正确。根据输入,如果你知道相同类型的花括号不会被嵌套,那么你很好。 – FrankieTheKneeMan 2013-03-11 21:22:56

+0

'“和{什么(关于字符串)喜欢)?”' – 2013-03-11 21:24:41

回答

1

如何:

Regex regexObj = new Regex(
    @"(?<=\()  # Assert that the previous character is a (
    [^(){}[\]]+  # Match one or more non-paren/brace/bracket characters 
    (?=\))   # Assert that the next character is a) 
    |    # or 
    (?<=\{)[^(){}[\]]+(?=\}) # Match {...} 
    |    # or 
    (?<=\[)[^(){}[\]]+(?=\]) # Match [...] 
    |    # or 
    [^(){}[\]\s]+ # Match anything except whitespace or parens/braces/brackets", 
    RegexOptions.IgnorePatternWhitespace); 

这不承担任何嵌套的括号/括号/括号。

3

这里是一个正则表达式,将给予正确的结果,从你的例子:

\s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?)|(?<=(?:\(|\[|\{).*?(?:\}|\]|\)).*?)\s 

这正则表达式是两个部分,由|(OR)语句分开:

  1. \s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?) - 查找对于前面的空白区域设置(),[]{}
  2. (?<=(?:\(|\[|\{).*?(?:\}|\]|\)).*?)\s - 在设置后寻找空白,[],或{}

这里是各部分的击穿:

第1部分(\s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?)):

1. \s    - matches white space 
2. (?=   - Begins a lookahead assertion (What is included must exist after the \s 
3. .*?   - Looks for any character any number of times. The `?` makes in ungreedy, so it will grab the least number it needs 
4. (?:\(|\{|\[) - A non passive group looking for `(`, `{`, or `[` 
5. .*?   - Same as #3 
6. (?:\]|\}|\)) - The reverse of #4 
7. .*?   - Same as #3 
8.)    - Closes the lookahead. #3 through #7 are in the lookahead. 

第2部分是同样的事情,但不是先行( (?=))它有一个看起来((?<=)

后问题编辑作者:

对于一个正则表达式,将与唯一完整的括号线搜索,您可以使用此:

.*\(.*(?=.*?\).*?)|(?<=.*?\(.*?).*\).*

你可以用它与{}[],所以你不得不更换()完整的卷曲和方括号。

相关问题