需要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#替换它。
我想要分两步完成 - 首先是基于分词的括号,然后是分词。
我想把这些案例作为错误的输入 -
只有可用的开始或结束括号
嵌套括号
总的来说,我想只分割格式良好(如果开始括号,那么必须有一个结尾)仅输入。
答案 0 :(得分:4)
这是一个正则表达式,可以从您的示例中获得正确的结果:
\s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?)|(?<=(?:\(|\[|\{).*?(?:\}|\]|\)).*?)\s
这个正则表达式由两部分组成,用|
(OR)语句分隔:
\s(?=.*?(?:\(|\{|\[).*?(?:\]|\}|\)).*?)
- 在()
,[]
或{}
(?<=(?:\(|\[|\{).*?(?:\}|\]|\)).*?)\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部分是相同的,但它不是前瞻((?=)
)而是有一个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);
这假定没有嵌套的括号/大括号/括号。