我有一个超过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以上。即表达式是forword(200以上)而非后退(在200之前或之后)以放置管道。
请告诉我正则表达式中缺少的内容。
非常感谢!
答案 0 :(得分:2)
's/(.{20,}?\b).*/|/'
替换整个字符串,没有换行符(因为它有可选的.{20,}?
和.*
)和1个带有替换字符串的字边界(\b
)。此外,您使用(...)
捕获文本,但您没有使用它。您可以使用反向引用来“恢复”替换结果中捕获的文本。
您至少需要删除.*
并在替换字符串中使用反向引用:
str02 = prxchange('s/(.{20,}?\b)/$1|/', -1, str1);
^ ^^
根据需要调整限制量词({20,}
)中的数字。
您还可以摆脱捕获组并使用\0
作为对整个匹配文本的反向引用:
str02 = prxchange('s/.{20,}?\b/\0|/', -1, str1);
<强>更新强>
除了
|
之外,还有一种方法可以没有空格吗?此外,它不应该在已经有|
的地方提供|
。
只需使用负面观察(见demo):
.{20,}?\b(?![\w|])
我们是否可以进行条件搜索和替换,即仅在长度超过
200
时才进行搜索和替换?
我们可以,但看起来很难看。我建议先检查字符串长度,如果满足条件,则继续替换:
if length(str1) > 200 then
str02 = prxchange('s/.{200,}?\b(?![\w|])/\0|/', -1, str1);
返回引用
您可以阅读有关regex back-references at regular-expressions.info的更多信息。这是一段摘录:
如果正则表达式具有命名或编号的捕获组,则可以在替换文本中重新插入由任何捕获组匹配的文本。您的替换文本可以根据需要引用任意数量的组,甚至可以多次引用同一组。这使得可以以多种不同的方式重新排列由正则表达式匹配的文本。
<强> UPDATE2 强>
现在,您似乎还需要在|
的两边“合并”单词(删除空格)。然后,只需使用以下正则表达式:
(.{20,}?)\b\s*
并替换为\1|
。