Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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
Regex 搜索一定长度的单词边界,并将其替换为'|';_Regex_Sas - Fatal编程技术网

Regex 搜索一定长度的单词边界,并将其替换为'|';

Regex 搜索一定长度的单词边界,并将其替换为'|';,regex,sas,Regex,Sas,我有一个超过600个字符的长字符串。我想用“|”替换长度刚好小于200的单词边界 我使用了以下代码来实现这一点。但是我没有,我一点运气都没有 data test; length str1 $200; str1 = "N=dddddd dddddd dddddd dddddddddd ddd ddddd dddddddd dd d ,n=,|t:14.2.2-1"; run; data test1; set test; str01 = prxchange('s/\b/|/

我有一个超过600个字符的长字符串。我想用“|”替换长度刚好小于200的单词边界

我使用了以下代码来实现这一点。但是我没有,我一点运气都没有

data test;
   length str1 $200;
   str1 = "N=dddddd dddddd dddddd dddddddddd ddd ddddd dddddddd dd d ,n=,|t:14.2.2-1";
run;

data test1;
   set test;
   str01 = prxchange('s/\b/|/', -1, str1);
   str02 = prxchange('s/(.{20,}?\b).*/|/', -1, str1);
run;
我知道第一个会搜索所有单词边界并用“|”替换它们,但我认为第二个会起作用。但是后者只给了我“|”作为输出

我想要的是将一个长脚注(超过600个字符)分解成4行语句,因为行不能超过200个字符。因此,我将用“|”替换长度不超过200的空格,并使用“|”分解字符串

提前谢谢

在实时场景中,我有以下情况

data test;
   length str1 $200;
   str1 = "XX XX XXXXX XXXX XXXXXXX XXX XXXXX X XXXXXX XXXXXXX XXXXXXXXX XX XXX XXXXXXXXX XXXXXXXXXXXX'X XXXXXX. XXXX XXXXXXXXX XX XXXXXXXXXX XXXXXXXXXX XXX XXXXXXXX. XXX XXXXXXX XXX XXXX XXXXXXXX XXXXXX XXXXXXXXXX XXX XXXXXXXXXX XXXX XXX XXXXX XXX XX XXXX XX XXXX XXXXXXX XXXXXXXXXX XXXXX XX XXX XXXXX XXX XXX XXXXX XX XXX XXXXXXXXXXX XXX XXXXXXXXXX XXXXX 11112525 65, XX XXXXX XXX XXXXXX XXX XXX XXX. XXXXXXXXXXXX, XXX XXXX XXXXX XXX XXXXX XXXXXXXX XXXX XXX XXXX XXXXXX XXXXXXXX XX "XXXXXXXX XXXXXXXX" XX XXX XXX XXXXXX XXX XXXX XXXXXXXXXXX XX XXXXXXXXXX XXXXX XX XXX XXX XXXXXXX XXXXXX. XXXX XX XX XXXX XXXXXX XXXXX XXXXXXXX XXXXX XXXXXXXX XXX XXXXXX XXXX XXXXXXXXXX XXXXXXXXXX XXX XXX XXXXXXXXXXXX XXXXXXX XXXXXXXXXX XXX XXXXXXXX XXXX. XXXXXXX, XXX XXXXXXX XXX XXXXXX XX "XXXXXXXX XXXXXXX - XX XXX XXXXXXX" XXX XXX XXXXXX XXXXX XXX XXX XXXXXXX XXXX XXXXXXX XXXXXXXXXX XXX XXXXXXXXXX X XXXXXXXXXXX XXXXXXXXXX XX XXXX XXXXX.  XXXXXXXXXXX XXXX XXXXXXXXX XXXX XXX XXXXXXX XXX XXXXXXXX X XXXXXXXXXX XXXXXXXXX, X XXXX XXX XXXX XX XXXXXX XXXXX, XXXXXXX XXXX XXXX XXXXXXXX XXXXXX XX XX XXXXXX XX XXXXXXXXX XXXXXX XXXXXXXX XXX XXXXXXXXXX XXXXXXX XX XXXXXXXXXX/XXXXXXXXXX XXX XXXXXXXX XXXXXXXXXX XX XXXXXXXX XXXXXXXX XX XXX XXX XXXXXX XX XXXXXX XXXX XXXX XXX XXX XXXXXXX XXXXXXXXXX XXXXXXXXXX. XXXX, XXX XXXXXXXX XXXXXXXX (XX XXXX XXXXX XXX XXXXXX) XXXX XXXXXXX XX XXX XXX XX XXX "XXXXXXXX XXXXXXXX - XX XXX XXXXXXX/XX XXXXXXXXXX".  XXX XXXX XX XXX XXXXXXXXX XXXX XXXX XXXX XX XXXXXXXXX XXXX XX XXXXXXX XX XXXXXX.  XXX XXXXXXX XXX XXXXXX XXXX XXX XXXXXXX XXXXXX XXXXXX XX XXX XXXXX XX XXXX XXXX, XXX XXX XXXXX XXXX XX XXXXXX XXXX XX X XXXXXXXXX.";
run;
正如建议的那样,我使用了:

data test1;
   set test;
   str01 = prxchange('s/(.{200,}?)\b\s*/\1|/', -1, compbl(str1));
run;
但是,它并不是将管道放置在长度小于或等于200个字符的单词边界处。它正在将管道铺设在200英尺以上。i、 e.表达方式是向前(200以上)而不是向后(200之前或在200处)来放置管道

请告诉我正则表达式中缺少什么

非常感谢

的/(.20,}?\b)。*/|/“用不换行的字符串替换整个字符串(因为它有可选的{20,}?和*),并用替换字符串(
\b
)替换一个单词边界。另外,您可以使用
(…)
捕获文本,但您没有使用它。您可以使用反向引用“还原”替换结果中捕获的文本

您至少需要删除
*
,并在替换字符串中使用back引用:

str02 = prxchange('s/(.{20,}?\b)/$1|/', -1, str1);
                               ^ ^^
根据需要调整限制量词(
{20,}
)中的数字

您还可以摆脱捕获组,使用
\0
作为整个匹配文本的反向引用:

str02 = prxchange('s/.{20,}?\b/\0|/', -1, str1);
更新

除了
|
之外,还有没有办法不留空间呢?如果已经有
|
,它也不应该给
|

只需对后面进行负面观察(请参见):

我们是否可以进行条件搜索和替换,即仅当长度大于
200
时才进行搜索和替换

我们可以,但它看起来很难看。我建议首先检查字符串长度,如果满足条件,则继续更换:

if length(str1) > 200 then 
    str02 = prxchange('s/.{200,}?\b(?![\w|])/\0|/', -1, str1);
反向引用

你可以阅读更多关于。以下是摘录:

如果正则表达式已命名或编号捕获组,则可以在替换文本中重新插入与任何捕获组匹配的文本。替换文本可以引用任意多个组,甚至可以多次引用同一组。这使得以多种不同的方式重新排列正则表达式匹配的文本成为可能

更新2

现在,您似乎还需要在
的两侧“合并”单词(删除空格)。然后,只需使用以下正则表达式:

(.{20,}?)\b\s*

并替换为
\1 |

@stribizev谢谢您的帮助!两者的结果相同,接近我想要的。最近,因为它将空间替换为|和空间。有没有一种方法可以让你没有空间,而且在已经有空间的地方也不应该给你空间。另外,您能详细说明一下您的解决方案吗?0美元或1美元的用途是什么?我们是否可以进行条件搜索和替换,即仅当长度超过200时才进行搜索和替换?再次感谢!因为我给出了答案,所以我删除了评论。至于$0或$1是做什么的?我想我在下面的回答中已经澄清了这一点。我现在将更新我的答案。@Stribizev,当我使用代码str02=prxchange('s/{200,}?\b(?[\w}])/\0 |/',-1,str1);我不会根据需要使用替换的“|”获取整个字符串。相反,它给出了“N=dddddddddddddddddddddddddddddddddddddddd,N=,| t |:14.2.2-1”(在t之后加上空格和一个额外的|),而不是N=ddddddddddddddddddddddddddddddddddddddddddd,N=,| t:14.2.2-1。有一点是肯定的:在
t:14>之前的
已经存在。如果要清除它们,请先删除所有
|
。要解决第二个问题,请使用
prxchange('s/(.{20,}?)\b\s*/\1 |/',-1,str1)。结果是
N=dddddddddddddddddddddddddddddddddddddddddddddd,N=,| t |:14.2.2-1
。同样,您不能仅通过1个操作删除现有字符并添加一些新字符。@Stribizev我在一个实时场景中尝试了这个正则表达式。但是|并没有被放置在200个字符以上。我需要有一个200个字符的|或一个长度不超过200的单词边界。在这种情况下,请您提供帮助。请尝试
s/{0,20}\b/\0 |/
@stribizhev谢谢!我试过这个表达,但它只给出了一个答案。". . .". 我使用了“regxfot3=prxchange('s/{0200}\b/\0 |/',-1,str1);”请查看更新的问题。
(.{20,}?)\b\s*