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

本文关键字:正则表达式 字符串 分割 | 更新日期: 2023-09-27 18:03:19

需要RegEx的帮助。使用c# .

括号内的一组词(圆括号、方框或大括号)应视为一个词。括号外的部分应该基于空格' '分割。

A)测试用例-

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

Result (Array of string) -
1. 安德鲁。
2. 伟大的音乐家
3.约翰。
4. Smith-Lt。Gen3rd

B)测试用例-

输入- Andrew. John

Result (Array of string) -
1. 安德鲁。
2. 约翰。

C)测试用例-

Input - Andrew {The Great} Pirate

Result (Array of string) -
1. 安德鲁。
2. 伟大的
3.海盗

输入是一个人或任何其他实体的名称。当前的系统是用Access编写的。他们一个字一个字地扫描。我正在用c#代替它。

我想分两步来做——首先是基于括号的分割,然后是单词分割。

我想把这些情况作为坏输入-

  1. 只支持开始或结束括号

  2. 嵌套的括号

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

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

下面是一个正则表达式,它将从您的示例中给出适当的结果:

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

此正则表达式分为两部分,由| (OR)语句分隔:

  1. 's(?=.*?(?:'(|'{|'[).*?(?:']|'}|')).*?) -查找(), []{}集合前的空白
  2. (?<=(?:'(|'[|'{).*?(?:'}|']|')).*?)'s -在(), []{}之后寻找空白

以下是各部分的分类:

第一部分('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部分是同样的事情,但它不是向前看((?=)),而是向后看((?<=))

作者编辑后的问题:

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

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

您可以使用它将()替换为{}[],以便您有完整的花括号和方括号。

这个怎么样:

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);

假设没有嵌套的圆括号/大括号/方括号