Notepad ++函数列表:即使为空也返回类

时间:2014-12-05 13:24:54

标签: regex notepad++

我正在尝试定义自定义函数列表(%appdata%/ Notepad ++中的functionList.xml),以便将其用作用作软件输入的基于文本的长文件的导航器。

我设法使其工作几乎完美,但仍有一个问题困扰我:我想返回一个类,即使它没有函数。< / p>

首先,这是我的文本文件的样本(你们中的一些人可能会认识到用于eQuest能量建模软件的.inp文件,但这是无关紧要的):

$ *********************************************************
$ **                                                     **
$ **              Electric & Fuel Meters                 **
$ **                                                     **
$ *********************************************************

$ ---------------------------------------------------------
$              Electric Meters
$ ---------------------------------------------------------

"EM1" = ELEC-METER      
   TYPE             = UTILITY
   ..


$ ---------------------------------------------------------
$              Fuel Meters
$ ---------------------------------------------------------



$ ---------------------------------------------------------
$              Master Meters
$ ---------------------------------------------------------

"MASTER-METERS 1" = MASTER-METERS   
   MSTR-ELEC-METER  = "EM1"
   MSTR-FUEL-METER  = "FM1"
   ..

$ ---------------------------------------------------------
$              Something else
$ ---------------------------------------------------------


"XXX" = blabla
    ..

这是我当前的解析器:

<parser 
    id="equest_full" 
    displayName="eQuest Full Function List">

    <!-- Find The entire Class using a positive lookahead -->
    <classRange
        mainExpr="\$.*?\r\n\r\n.*?(?=\$)" 
        displayMode="node" >

        <!-- Here we return just the Class name -->
        <className>
            <!-- Find only the text, using a negative lookahead to exclude multiple white spaces -->
            <nameExpr expr='\w(\w|-|/| (?! ))+'/>
        </className>

        <!-- Here we find the "function" - here it's something that starts a line with "XXXX" = "blabla" -->
        <function
            mainExpr='^\".*?\" = [^ ]+' >
            <functionName>
                <!-- We already have exactly what we want with the above -->                    
                <funcNameExpr expr=".*"/>
            </functionName>
        </function>
    </classRange>
    <function 
        mainExpr="\$.*?\r\n\r\n">
        <!-- A poor attempt to display classes even if empty... doesn't work properly -->
        <functionName>
            <!-- Find only the text, using a negative lookahead to exclude multiple white spaces -->
            <nameExpr expr="\w(\w|-|/| (?! ))+"/>
        </functionName>
    </function>
</parser>

它将在“功能列表”窗格中显示以下内容: Function List in its current state

我非常希望它是否也可以在列表中显示“Fuel Meters”,即使它是空的。其背后的原因是我将使用它作为导航页面,因此我需要锚定空白部分,以便我可以快速去那里并添加内容。

在Notepad ++中可以吗?任何帮助将不胜感激。

我一直在想的东西:如果我可以在那里编写常规代码,在ClassRange&gt;下功能,我会做一个IF声明。如果找到“^ \”。*?\“= [^] +”,则继续进行其余的解析。否则,返回班级第一行的位置。我不知道如何使用RegEx或者是否可行。


更新:我认为我找到了一种可行的方法,但我无法弄清楚正确的正则表达式。 基本上,我认为我对当前解析器的问题是,当类为空时,它仍然作为一个类返回,因此以后不会被类范围之外的函数拾取。 我需要找到一种方法来修改它:

<classRange
                mainExpr="\$.*?\r\n\r\n.*?(?=\$)" 
                displayMode="node" >

它不需要拿起“Fuel Meters”课程。现在它确实接受了这个:

$ ---------------------------------------------------------
$              Fuel Meters
$ ---------------------------------------------------------

直到下一个$ sign。

如何修改上面的Regex以确保至少有一个字符不是\ n \ r或空格?

1 个答案:

答案 0 :(得分:2)

你知道这个了吗?我不确定你在问什么,但是使用这样的东西:

\$\s-+\s+\$(?:\s+\w+)+

您获得匹配的代码:

$ ---------------------------------------------------------
$ ANY ALPHANUMERIC SENTENCES HERE

但你到底想要捕捉到什么?

或者如果你只想要类名,你可以这样做:

(?<=\$\s-+\s+\$\s+)\w+(?:\s+\w+)+