代码之家  ›  专栏  ›  技术社区  ›  NotAgain

这个正则表达式可以提高内存效率吗

  •  0
  • NotAgain  · 技术社区  · 5 年前

    我得到的xml是纯无格式的文本块。我必须做一些替换,我使用正则表达式find and replace。 例如:

    <MeasureValue><Text value="StartCalibration" /></MeasureValue>
    

    必须转换成

    <MeasureValue type="Text" value="StartCalibration"/>
    

    我写的正则表达式是

    <MeasureValue><((\w*)\s+value="(.*?)".*?)></MeasureValue>
    

    替换部件是:

    <MeasureValue type="$2" value="$3"/>
    

    这里有一个 link 同样的。

    问题是,在一个出现了370次这样的事件的文件中,我出现了内存不足错误。我听说过所谓的贪婪正则表达式模式,并想知道这是否是困扰我的情况。如果这已经是内存效率,那么我将保持原样,并尝试增加服务器内存。我必须处理数千份这样的文件。

    编辑:这是Elasticsearch的Logstash脚本的一部分。根据文档,Elasticsearch在内部使用Apache Lucene解析正则表达式。不确定这是否有用。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Caio Oliveira user -1    5 年前

    根据经验,特异性与正则表达式的效率呈正相关。 所以 了解你的数据 然后做一些与之匹配的手术。

    你构建的正则表达式越具体,比如逐字写下模式(通常以一个奇怪的正则表达式结束),它所需的资源就越少,因为它在你的数据中能够匹配的“可能性”就越少。

    更准确地说,假设我们正在尝试匹配一个字符串

    2014-08-26 app[web.1]: 50.0.134.125
    

    例如

    (.*) (.*) (.*)
    

    使其过于开放,容易与许多不同的模式和组合相匹配,因此需要更多的时间来处理其无限的可能性。检查这里 https://regex101.com/r/GvmPOC/1

    另一方面,你可以多花点时间构建一个更精细的表达方式,比如:

    ^[0-9]{4}\-[0-9]{2}-[0-9]{2} app\[[a-zA-Z0-9.]+\]\: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$`
    

    我同意,这很可怕,但要精确得多。它不会浪费你宝贵的资源去寻找不必要的东西。检查这里 https://regex101.com/r/quz7fo/1

    另一件需要考虑的事情是:运营商,比如 * + 根据字符串的大小,执行扫描操作可能需要一些时间。此外,只要有可能,请指定锚点 ^$ 还可以帮助脚本不要试图在同一个字符串中找到太多匹配项。


    把它带到你的现实中。。。

    如果我们必须使用正则表达式。

    百万美元的问题是,我们怎样才能把你的正则表达式变成更精确的东西?

    自从 标签名称长度没有限制 在XML中。。。没有办法完全具体化:(

    • 我们可以尝试指定要匹配和避免的字符 . \w .所以用更像 a-zA-Z 更可取。还利用了否定类 [^] 将有助于缩小可能性的范围。

    • 避免 * ? 试着用一个量词 {} (虽然我不知道你的数据来做这个决定)。正如我前面所说,XML对此没有限制。

    • 我没有确切地理解这个系统的功能 ? 在代码中,所以删除它不太容易处理。

    结果是

    <(([a-zA-Z]+) value="([^"]*)"[^<>]*)>
    

    不过变化不多。你可以试着测量一下,看看是否有任何改善。

    但也许最好的方法是 不使用正则表达式 总之:( 我不知道你使用的是哪种语言,但如果处理时间变得复杂,我建议你不要使用正则表达式,尝试其他方法。

    如果有可能使用 XML解析器 那就更好了。

    https://softwareengineering.stackexchange.com/questions/113237/when-you-should-not-use-regular-expressions

    抱歉,如果它不像你预期的那样具有决定性,但是研究它的领域同样是开放的。