itzyx 发表于 2022-4-17 00:12:39

【已解决】关于正则表达式的疑问

本帖最后由 itzyx 于 2022-4-17 19:45 编辑

前两天在论坛发表了一个请教正则表达式的帖子,后面听取A大的建议,先提取想要数据的那一段落,然后再提取关键字后面的数据,用这个方法确实也成功了。但是今天提取另外一组数据的时候居然报错了,我打开看了一下,数据的格式相同,就是内容多了一点,我用Au3.REHelper 试了好几次,只要粘贴全部文本,用正则表达式提取就无法匹配,但是
我单独复制那一段落粘贴,用正则表达式提取就可以正常匹配。真的百思不得其解,这个是我正则表达式写的有错误嘛?
原数据:
   ............(前面省略)
   "SVs Used Trend":{
      "type":"chart",
      "unit":"",
      "line":[
            {
                "name":"GPS",
                "points":[
                  {
                        "timestamp":"2022-04-07 02:18:40.000",
                        "value":0
                  },
                  {
                        "timestamp":"2022-04-07 02:18:41.000",
                        "value":0
                  },
                  {
                        "timestamp":"2022-04-07 02:18:43.000",
                        "value":0
                  .............(中间很长,省略了)

                     },
                  {
                        "timestamp":"2022-04-08 01:12:51.000",
                           "value":23
                  }
                ]
            }
      ]
    },
    "Average CN0 Trend":{
      "type":"chart",
.............(后面省略)
这是我用的(?si)"SVs Used Trend":{.+},\s*"Average CN0 Trend" 表达式,提取中间这一段落,两个文本我仔细比较了一下,"SVs Used Trend":{ 前,跟 "Average CN0 Trend":{后 没什么区别,就是不知道有的时候为啥全文匹配的时候无法成功。后面我试了一下,(?si)"SVs Used Trend":{.+, 也可以成功,但是把后面的文本也匹配进去了。被正则搞得有点头疼,想了半天,决定还是请教一下各位大佬。

tubaba 发表于 2022-4-17 17:52:17

以 前碰到过.源文超过一定数量,会匹配失败.可能输入的长度确实有限制.

haijie1223 发表于 2022-4-17 08:56:06

改成.+?试试

afan 发表于 2022-4-17 10:14:14

本帖最后由 afan 于 2022-4-17 10:20 编辑

你要用出问题时的字符串做范文,没问题的做范文有何意义呢?
这些段落顺序是保持一定的吗?"SVs Used Trend":{ 后面一定会有 "Average CN0 Trend":{ ?
如果是这样,且没有空白字符的变化,那么你的表达式(?si)"SVs Used Trend":{.+},\s*"Average CN0 Trend" 没什么问题
你也可以试试

Highlight code by AuREHelper
(?si)"SVs Used Trend":{.+?}\s*(?=,\s*"|$)


itzyx 发表于 2022-4-17 11:06:13

afan 发表于 2022-4-17 10:14
你要用出问题时的字符串做范文,没问题的做范文有何意义呢?
这些段落顺序是保持一定的吗?"SVs Used Tren ...

A大这个是有问题的范文,跟正常范文比较,就是内容多与少的问题,所有文件都是同一个工具生成的,我用文本比较工具对比了一下,目前还没发现什么区别。
所以这就是伤脑筋的问题,我试了好几个文本都是OK的,有问题的文本我也打开看了,就算有空格忽略,这个表达式应该也可以正常匹配,但是我全文匹配的时候就是有问题,主要文本太大了,不然我都上传了,感谢A大解答,我今天再试试。

itzyx 发表于 2022-4-17 11:10:38

haijie1223 发表于 2022-4-17 08:56
改成.+?试试

感谢发哥解答,这个我试了,没用。
头疼的问题,明明是同一个工具生成的文本,有的文本提取正常得很,有的就是无法匹配,我肉眼看了好几遍,用工具比了一下,也没看出啥区别 。我先用A大的方法试一下。

itzyx 发表于 2022-4-17 11:37:59

afan 发表于 2022-4-17 10:14
你要用出问题时的字符串做范文,没问题的做范文有何意义呢?
这些段落顺序是保持一定的吗?"SVs Used Tren ...

A大,试了给的表达式没用。
确实没有源文本,光听我说,比较抽象 大佬们也难以对症下药,我觉得可能还是文本的问题,只是目前我还未发现。
因为之前另一个段落提取后,我想提取name 后的关键词的数据,一开始用的表达式:(?si)"name":"GPS",\s*"points":\[\s*{(.+?)\],也是部分有效,后面改成(?si)"name":"GPS",\s*"points":\[\s*{([^\]]+)\] ,才全部适用,说实话以我小白的眼光来看,我感觉这两个表达式没多大区别,但是后面的表达式改动了一下确实就行了。

afan 发表于 2022-4-17 11:55:58

itzyx 发表于 2022-4-17 11:06
A大这个是有问题的范文,跟正常范文比较,就是内容多与少的问题,所有文件都是同一个工具生成的,我用 ...

能重现问题的才是有问题的范围。你这贴出来的用你自己的表达式测试都没问题那还叫有问题吗?
无法确定就用附件的形式上传也行(精简到能重现问题即可)

afan 发表于 2022-4-17 11:59:29

itzyx 发表于 2022-4-17 11:37
A大,试了给的表达式没用。
确实没有源文本,光听我说,比较抽象 大佬们也难以对症下药,我觉得可能还是 ...

估计含有不可打印字符,需要上传源文本。
还可以做个简单测试
Highlight code by AuREHelper
(?si)"SVs Used Trend":{[^ ](?#)+?}\s*(?=,\s*"|$)


itzyx 发表于 2022-4-17 13:29:33

afan 发表于 2022-4-17 11:55
能重现问题的才是有问题的范围。你这贴出来的用你自己的表达式测试都没问题那还叫有问题吗?
无法确定就 ...

A大经过我不断的排除,终于精确定位问题所在,
但是我看这段文本与其他段没有啥区别啊,但是只要删了这一小段就OK。下面是文本有问题的那一段 还有源文件   },
                  {
                        "timestamp":"2022-04-07 20:00:17.000",
                        "value":44.733333333333334
                  },
                  {
                        "timestamp":"2022-04-07 20:00:18.000",
                        "value":44.733333333333334
                  },
                  {
                        "timestamp":"2022-04-07 20:00:19.000",
                        "value":44.733333333333334
                  },
                  {
                        "timestamp":"2022-04-07 20:00:20.000",
                        "value":44.733333333333334
                  },
                  {
                        "timestamp":"2022-04-07 20:00:21.000",
                        "value":44.733333333333334
                  },
                   {
                        "timestamp":"2022-04-07 20:00:22.000",
                        "value":44.733333333333334
                  },


haijie1223 发表于 2022-4-17 14:23:08

itzyx 发表于 2022-4-17 13:29
A大经过我不断的排除,终于精确定位问题所在,
但是我看这段文本与其他段没有啥区别啊,但是只要删了 ...

通过你的动图来看,应该不是正则的问题,可能是文本太长,缓冲区不够用了

itzyx 发表于 2022-4-17 14:46:23

haijie1223 发表于 2022-4-17 14:23
通过你的动图来看,应该不是正则的问题,可能是文本太长,缓冲区不够用了

发哥,还有这种情况嘛,第一次听说。
这个能用什么方法解决呢,不然截取的文本太长,提取数据,时间会增加不少。
用(?si)"SVs Used Trend":{.+},\s*"Average CN0 Trend" 不行,用(?si)"SVs Used Trend":{.+} 却好得,就是缓冲区的问题嘛

afan 发表于 2022-4-17 16:57:20

你这数据接近 160万 行,捕获的单个元素有 130万 行…… 你可真敢玩,我 XP 测试两下直接就挂了
不适合就换条道,用不着用正则直接硬刚,"SVs Used Trend" 和 "Average CN0 Trend" 可直接定位,StringMid() 就行了

haijie1223 发表于 2022-4-17 18:11:29

itzyx 发表于 2022-4-17 14:46
发哥,还有这种情况嘛,第一次听说。
这个能用什么方法解决呢,不然截取的文本太长,提取数据,时间会增 ...

后面这条正则,没有限制结尾,所以到了缓冲区的限制边界,应该会自动截断。
前面那个正则,强制界定了结束字符,可能会导致匹配失败。我猜的。
程序读取到的数据是放到了内存中,程序的内存不是无限大,所以应该会有缓冲区的最大范围。也是猜的。

itzyx 发表于 2022-4-17 19:08:45

afan 发表于 2022-4-17 16:57
你这数据接近 160万 行,捕获的单个元素有 130万 行…… 你可真敢玩,我 XP 测试两下直接就挂了
不适合就 ...

哈哈,确实之前不知道,我准备用StringMid来截取字段了,我一直以为我的正则有问题呢,但怎么试,都不对,所以是我想不通的点   {:1_247:}
页: [1] 2
查看完整版本: 【已解决】关于正则表达式的疑问