当问题以单个示例的形式陈述时,不可避免地会出现模棱两可的情况。这个问题也不例外。
对于问题中给出的示例,所需的字符串很明确:
super example of string key : text I want to keep - end of my string
^^^^^^^^^^^^^^^^^^^
然而,这个字符串只是字符串和边界字符串的一个例子,某些子字符串要被识别。我会考虑一个带有泛型边界字符串的泛型字符串,表示如下。
abc FF def PP ghi,PP jkl,FF mno PP pqr FF,stu FF vwx,PP yza
^^^^^^^^^^^^ ^^^^^
PP 是前面的字符串,FF 是后面的字符串,派对帽子指示要匹配哪些子字符串。 (在问题中给出的示例中,key : 是前面的字符串,- 是后面的字符串。)我假设 PP 和 FF 之前和之后是单词边界(所以 PPA 和FF8 不匹配)。
我的假设,正如派对帽子所反映的那样,如下所示:
- 第一个子字符串
PP 前面可以有一个(或多个)FF 子字符串,如果存在,则忽略它们;
- 如果在遇到
FF 之前PP 后跟一个或多个PPs,则后面的PPs 是前后字符串之间的子字符串的一部分;
- 如果在遇到
PP 之前PP 后跟一个或多个FFs,则将PP 之后的第一个FF 视为以下字符串。
请注意,这里的许多答案只处理表单的字符串
abc PP def FF ghi
^^^^^
或
abc PP def FF ghi PP jkl FF mno
^^^^^ ^^^^^
可以使用正则表达式、代码结构或两者的组合来识别感兴趣的子字符串。我不判断哪种方法最好。我将只提供以下将匹配感兴趣的子字符串的正则表达式。
(?<=\bPP\b)(?:(?!\bFF\b).)*(?=\bFF\b)
Start your engine!1
我使用 PCRE (PHP) 正则表达式引擎对此进行了测试,但由于正则表达式一点也不陌生,我确信它可以与 .NET 正则表达式引擎(非常强大)一起使用。
正则表达式引擎执行以下操作:
(?<= : begin a positive lookbehind
\bPP\b : match 'PP'
) : end positive lookbehind
(?: : begin a non-capture group
(?! : begin a negative lookahead
\bFF\b : match 'FF'
) : end negative lookahead
. : match any character
) : end non-capture group
* : execute non-capture group 0+ times
(?= : begin positive lookahead
\bFF\b : match 'FF'
) : end positive lookahead
这种技术,一次匹配一个字符,在前面的字符串之后,直到字符是F,然后是F(或更一般地说,字符是构成后面字符串的字符串),被称为Tempered Greedy Token Solution。
如果我上面提出的假设发生变化,自然就必须修改正则表达式(如果可能的话)。
1.移动光标查看详细说明。