正则表达式由花括号中的空间保留字符串分割

时间:2011-09-19 13:38:48

标签: regex split

我有一个看起来像

的字符串

arg1 {0 1} arg2 {5 87} string {with space} ar3 1

它按空格分割,但字符串也可能包含空格,因此会导致带空格的字符串出现问题。我仍然需要拆分这个字符串,但是我不想拆分包含在curl括号中的字符串,并以string关键字作为前缀。这意味着上面的字符串应该像那样分割

arg1
{0
1}
arg2
{5
87}
string
{with space}
ar3
1

无法实现这一点,我真的需要阅读很多关于正则表达式的内容。你能帮我吗?

2 个答案:

答案 0 :(得分:2)

第1步:像往常一样用空格分割,得到一个数组

第2步:遍历数组,如果找到{[a-zA-Z]+,则用空格连接下一个元素,然后删除下一个元素。

然后你得到了你想要的东西。以下awk命令显示为一个示例。

echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1"|awk '{split($0,a); 
for(i=1;i<=length(a);i++){
  if(a[i]~/{[a-zA-Z]+/){a[i]=a[i]" "a[i+1];delete a[i+1];} 
  if(a[i])print a[i];} }'

arg1
{0
1}
arg2
{5
87}
string
{with space}
ar3
1

<强> ==更新==

好的,根据您的评论,这也有效:

步骤1,找出那些你不想“拆分”的字符串,用一个特殊字符串替换。而重要的是将找到的字符串保存到另一个数组grep示例中的模式:

echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1 {abc def} {xyz zyx}"|grep -E -o '\{([a-zA-Z]+\s*)*\}'

        {with space}
        {abc def}
        {xyz zyx}

after replace:xxxxxxxxx as the special string

kent$  echo "arg1 {0 1} arg2 {5 87} string {with space} ar3 1 {abc def} {xyz zyx}"|sed -r 's#\{([a-zA-Z]+\s*)*\}#xxxxxxxxx#g'

arg1 {0 1} arg2 {5 87} string xxxxxxxxx ar3 1 xxxxxxxxx xxxxxxxxx

step2,做拆分

步骤3,用右索引替换特殊字符串。

答案 1 :(得分:0)

我不知道QRegExp,所以我不知道它是否具有lookaround功能。如果确实如此,你可以尝试拆分这样的东西:

(?<!(^|})[^{]*\bstring\s{[^}]*)\s

除了紧跟在单词string之前的一对大括号内的那些空格字符之外,它应该分开。如果string关键字已经在一组大括号内,它将忽略它。

您还可以使用简化版(?<!\bstring\s{[^}]*)\s,但这会受到foo {string {bar qux}}等奇怪内容的影响。