Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regexp在大括号中按保留空格的字符串拆分_Regex_Split - Fatal编程技术网

Regexp在大括号中按保留空格的字符串拆分

Regexp在大括号中按保留空格的字符串拆分,regex,split,Regex,Split,我有一根这样的绳子 arg1 {0 1} arg2 {5 87} string {with space} ar3 1 arg1{0 1}arg2{5 87}字符串{带空格}ar3 1 它是按空格分割的,但字符串也可能包含空格,因此它会导致带有空格的字符串出现问题。我仍然需要拆分此字符串,但我不希望拆分包含在大括号中且前缀为string关键字的字符串。这意味着上面的字符串应该像这样拆分 arg1 {0 1} arg2 {5 87} string {with space} ar3 1 不能实现这

我有一根这样的绳子

arg1
{0
1}
arg2
{5
87}
string
{with space}
ar3
1
arg1{0 1}arg2{5 87}字符串{带空格}ar3 1

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

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

不能实现这个,我真的需要读很多关于正则表达式的书。你能帮我吗?

步骤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
第二步,分开


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

我不知道QRegExp,所以我不知道它是否有功能。如果有,您可以尝试在类似以下内容上拆分:

(?<!(^|})[^{]*\bstring\s{[^}]*)\s
(?
除紧跟在单词
string
前面的一对大括号内的空格字符外,它应该在任何空格字符上拆分。如果
string
关键字已经在一组大括号内,它将忽略该关键字


你也可以使用一个简化的版本:
(?,虽然这会受到像
foo{string{bar qux}}

这样奇怪的东西的影响,但你可能需要两次才能完成。虽然可能只使用一个正则表达式,但它可能会让你的眼睛流血或头部爆炸。是的,正则表达式实际上可以做到这一点:)然后我会很感激一些在大括号中保留任何文本的按空格分割的解决方案。您可以使用哪种类型的正则表达式来进行分割有限制吗?例如,您是尝试在Perl中还是使用
sed
?我使用的是QRegExp,它是以Perl的regexp为模型的。我刚刚意识到您正在分割一些bra被分割的字符串,但不是其他字符串。分割/不分割的规则是什么?大括号中的非数字字符?为什么要分割然后合并?这看起来像是不必要的操作。不分割不必要的字符串不值得吗?谢谢,但是
\{([a-zA-Z]+\s*)*}
对我不起作用。
echo“arg1{0 1}arg2{5 87}字符串{with space}ar3 1{abc def}{xyz zyx}“{124; grep-E-o'\{([a-zA-Z]+\s*)*\}”
不会在我的电脑上打印任何内容。你知道发生了什么吗?你的grep是别名吗?试试
echo“…”{egrep-o'\{([a-zA-Z]+\s*)*}”
它能用吗?我试过了,在Bash和Zsh下,GNU grep 2.5.1也能用。无论如何,我已经用regexp+cycle解决了这个问题,但我只想用正则表达式来拆分它。Justin的解决方案看起来不错,但不起作用。QRegExp给出了“糟糕的前瞻语法”
上出现错误。文档说明
零宽度正向和零宽度反向先行断言(?=pattern)和(?!pattern)都受与Perl相同语法的支持。Perl的先行断言“独立”子表达式和条件表达式不受支持。
。有什么解决方法吗?在regexr上尝试过这个正则表达式,它似乎不起作用。@axe-regexr使用JavaScript引擎,它不支持lookbehinds。现在,我看不到一种没有lookbehinds的方法来实现这一点,所以如果QRegExp不支持它们,我建议正如Kent所建议的,使用两次传球。Qt使用的引擎不支持某些lookbehind,看起来循环是唯一的方法。谢谢。