我正在尝试定义自定义函数列表(%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>
它将在“功能列表”窗格中显示以下内容:
我非常希望它是否也可以在列表中显示“Fuel Meters”,即使它是空的。其背后的原因是我将使用它作为导航页面,因此我需要锚定空白部分,以便我可以快速去那里并添加内容。
在Notepad ++中可以吗?任何帮助将不胜感激。
我一直在想的东西:如果我可以在那里编写常规代码,在ClassRange&gt;下功能,我会做一个IF声明。如果找到“^ \”。*?\“= [^] +”,则继续进行其余的解析。否则,返回班级第一行的位置。我不知道如何使用RegEx或者是否可行。
更新:我认为我找到了一种可行的方法,但我无法弄清楚正确的正则表达式。 基本上,我认为我对当前解析器的问题是,当类为空时,它仍然作为一个类返回,因此以后不会被类范围之外的函数拾取。 我需要找到一种方法来修改它:
<classRange
mainExpr="\$.*?\r\n\r\n.*?(?=\$)"
displayMode="node" >
它不需要拿起“Fuel Meters”课程。现在它确实接受了这个:
$ ---------------------------------------------------------
$ Fuel Meters
$ ---------------------------------------------------------
直到下一个$ sign。
如何修改上面的Regex以确保至少有一个字符不是\ n \ r或空格?
答案 0 :(得分:2)
\$\s-+\s+\$(?:\s+\w+)+
您获得匹配的代码:
$ ---------------------------------------------------------
$ ANY ALPHANUMERIC SENTENCES HERE
但你到底想要捕捉到什么?
或者如果你只想要类名,你可以这样做:
(?<=\$\s-+\s+\$\s+)\w+(?:\s+\w+)+