使用括号分割字符串的正则表达式

时间:2013-03-11 21:17:34

标签: c# regex

需要RegEx的帮助。使用C#。

括号中的单词组(圆形或方框或卷曲)应视为一个单词。括号内的部分应根据空格分割。

A)测试用例 -

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

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

B)测试用例 -

输入 - Andrew. John

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

C)测试用例 -

输入 - Andrew {The Great} Pirate

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

输入是个人或任何其他实体的名称。当前系统在Access中编写的非常旧。他们通过逐个字符扫描来做到这一点。我用C#替换它。

我想要分两步完成 - 首先是基于分词的括号,然后是分词。

我想把这些案例作为错误的输入 -

  1. 只有可用的开始或结束括号

  2. 嵌套括号

  3. 总的来说,我想只分割格式良好(如果开始括号,那么必须有一个结尾)仅输入。

2 个答案:

答案 0 :(得分:4)

这是一个正则表达式,可以从您的示例中获得正确的结果:

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

这个正则表达式由两部分组成,用|(OR)语句分隔:

  1. \s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?) - 在()[]{}
  2. 集之前查找空格
  3. (?<=(?:\(|\[|\{).*?(?:\}|\]|\)).*?)\s - 在()[]{}
  4. 集之后查找空白区域

    以下是每个部分的细分:

    第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部分是相同的,但它不是前瞻((?=))而是有一个lookbehind((?<=)

    在作者编辑问题之后:

    对于将搜索只有完整括号的行的正则表达式,您可以使用:

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

    您可以使用它将()替换为{}[],这样您就可以完成卷曲和方括号。

答案 1 :(得分: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);

这假定没有嵌套的括号/大括号/括号。