通过使用带有单词边界的正则表达式和带有非字母数字字符的文本来解决问题

2020-08-16 14:19发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

使用带有单词边界的正则表达式时遇到问题。

首先:我的目标。 我想删除文本中所有少于5个字符的单词。 像往常一样,我开始玩DEMO_REGEX_TOY。 首先尝试: \ <\ S {1,5} \> 。 这应该将每个单词与1到5个字符匹配。 但是在示例程序(文本: Cathy的黑猫……)中,它通过选项FIRST OCCURRENCE, Cathy ,所有出现的 Cathy 和 s 。 \ <和\>的文档说单词被定义为不间断的字母数字字符字符串。字母数字是字符/字母和数字,所以我的错。 但是,如果我将长度更改为7或更大,那么突然之间,整个单词都匹配了( Cathy's )。 那怎么可能 我在这里想念什么? 当我将 \ S 更改为 [[:: graph:]] 时,它的工作原理相同。

任何线索,我将不胜感激。 提前非常感谢!

最好的问候

Michał

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

使用带有单词边界的正则表达式时遇到问题。

首先:我的目标。 我想删除文本中所有少于5个字符的单词。 像往常一样,我开始玩DEMO_REGEX_TOY。 首先尝试: \ <\ S {1,5} \> 。 这应该将每个单词与1到5个字符匹配。 但是在示例程序(文本: Cathy的黑猫……)中,它通过选项FIRST OCCURRENCE, Cathy ,所有出现的 Cathy 和 s 。 \ <和\>的文档说单词被定义为不间断的字母数字字符字符串。字母数字是字符/字母和数字,所以我的错。 但是,如果我将长度更改为7或更大,那么突然之间,整个单词都匹配了( Cathy's )。 那怎么可能 我在这里想念什么? 当我将 \ S 更改为 [[:: graph:]] 时,它的工作原理相同。

任何线索,我将不胜感激。 提前非常感谢!

最好的问候

Michał

付费偷看设置
发送
5条回答
软件心理学工程师
1楼 · 2020-08-16 14:46.采纳回答

我要说的唯一问题是单词被定义为不间断的字母数字字符" /abapdocu_latest_index_htm/latest/zh-CN/index.htm?file=abenregex_search.htm">文档,根据我的说法,这是完全错误的。 如果认为\ <和\>仅暗示左右字符的条件,则它们必须为字母数字字符。 介于两者之间的所有字符都可以是任何字符。 您可以使用以下内容排除单引号:

 \ <[[[alpha:]]] {1,7} \> 

关于[[:graph:]], 文档说" 所有可显示的集 空格和水平制表符以外的字符"。 因此,您得到的结果非常合乎逻辑,我不知道您为什么提及它。

暮风yp
2楼-- · 2020-08-16 14:37

您好MichałBadura

我同意,您解释的正则表达式处理似乎存在问题。 如果将长度设为1到5,为什么单引号是非字母数字字符? 如果将长度设为1到7,为什么它是字母数字?

看看您的任务,采用其他方法怎么样? 找到所有用空格分隔的单词,然后删除长于指定宽度的单词(例如:[^ \ s] +)。

亲切的问候,

Mateusz

粗暴的香蕉
3楼-- · 2020-08-16 14:34

感谢您 Mateusz Adamus 为您提供答案! 我认为Sandra Rossi有正确的解决方案。

我想摆脱较短的单词。 由于它不适用于单词边界,因此我尝试了另一种方法: ^ \ S {1,5} \ s | \ s \ S {1,5} \ s | \ s \ S {1,5} $ 。 但是为此,我将不得不循环执行替换操作,直到没有其他要替换的东西为止。

打个大熊猫
4楼-- · 2020-08-16 14:45

您好,Michał

我不确定 如果您已经获得所需的答案,则不需要。 您提到Sandra得到了正确的解决方案。

否则,这是我的ABAP解决方案。

 DATA(lv_haystack)='凯西的黑猫'。
 DATA(lv_regex)='[^ \ s] +'。

 在字符模式结果数据(lt_results)中找到lv_regex的所有正则表达式lv_regex。
 删除lt_results长度> 5的地方。

 循环到lt_results引用到数据(ld_result)。
   lv_haystack + ld_result-> offset(ld_result-> length)=''。
 ENDLOOP。

亲切的问候,
Mateusz
Doze时光
5楼-- · 2020-08-16 14:54

感谢您的回答和评论,Sandra Rossi Mateusz Adamus 。 也许我没有说清楚,但我有我需要的答案! ABAP文档具有误导性,Sandra提出的正则表达式非常漂亮! 在我的用例中,它不仅是单引号,而且还不是空字符。 因此正则表达式为:

 SPAN {
 字体家族:" Courier New";
 字体大小:10pt;
 颜色:#000000;
 背景:#FFFFFF;
 }
 .L0S55 {
 颜色:#800080;
 }

 DATA(regex)=`(?:^ | [^ [:graph:]])[[:graph:]] {1,5}(?![[:graph:]]))。

与我的( ^ \ S {1,5} \ s | \ s \ S {1,5} \ s | \ s \ S {1,5} $ ),为此我必须实现一个DO循环,以替换所有出现的情况。

一周热门 更多>