【发布时间】:2015-10-27 21:19:59
【问题描述】:
我有一个超过 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 上方。即,表达式正在前进(高于 200)而不是后退(在 200 之前或处)来放置管道。
请让我知道我们在正则表达式中缺少什么。
非常感谢!
【问题讨论】:
-
@stribizhev 感谢您的提示帮助!两者都给出了相同的结果,并且接近我想要的结果。最近,因为它用 | 替换了一个空格和空间。有没有办法没有空间?它也不应该给 |已经有 | 的地方。另外,您能否详细说明一下 $0 或 $1 的解决方案?我们可以进行条件搜索和替换,即仅当长度超过 200 时才进行搜索和替换?再次感谢!
-
自从我给出答案后,我删除了评论。至于 $0 或 $1 的作用是什么?,我想我在下面的答案中已经阐明了这一点。我现在将更新我的答案。