从字符串中提取除字括号中的单词之外的所有单词

时间:2014-04-16 13:11:40

标签: regex matlab

同样,我完全陷入了创建正则表达式的过程中。

我有一个字符串模式,如:

str = ' wordA [] wordAB [xyz] wordABC [x] '

因此,括号[ ... ]或空括号[]中总会出现一个单词。单词的长度,前导和尾随空格以及括号内的字符数是随机的。随机的是这个序列重复的频率。

我想提取没有括号的单词:

output = 

    'wordA'    'wordBC'    'wordABC'

我认为问题是方括号,因为它们是正则表达式的功能字符。我试过像

这样的东西
output = regexp(str,'^\[.+\]$','split')

并且变化没有成功。

任何提示?

1 个答案:

答案 0 :(得分:2)

我们可以使用\w+正则表达式选择所有单词。但它会选择所有单词(包括括号中的那些单词)。括号外的单词在它们之前和之后都有空格,因此我们可以添加正面的lookbehind (?<=\s) - 确保单词前面有空格,并且正向前瞻(?=\s) - 确保后面有空格字。另外,第一个单词之前没有空格,因此我们需要包含条件以包含字符串的开头,为我们提供正面的后置(?<=\s|^)。最后我们有完整的正则表达式:

(?<=\s|^)\w+(?=\s)

Regular expression visualization

如果您有wordA[]字符串(无空格),则需要将[添加到正向前瞻。

(?<=\s|^)\w+(?=\s|\[)

Regular expression visualization

如果您有wordA [ xyz ]个字符串(括号内的空格),则上述正则表达式不起作用,我们需要不同的策略 - 找到之前没有[的字词。但是,我们不能只在没有[在他们之前]的情况下说单词,因为它与yz中的[xyz]相匹配,我们需要说我们需要的文字不是由[引导的和]以外的符号。

(?<!\[[^]]*)\w+

Regular expression visualization