如果X在Y之前存在但是Y可能不存在,则正则表达式匹配

时间:2015-06-05 06:23:46

标签: regex

我的文字是这样的:

Stuff
#One: 
  *lots of stuff* 
  visible=true
  *lots of stuff* 
#Two: 
  *lots of stuff* 
  visible=false
  *lots of stuff* 
#Three: 
  *lots of stuff* 
  visible=true
  *lots of stuff* 
Stuff....

很多东西不仅有很多东西,而且还可以改变。如果" One:.... visible = true"我需要能够返回true。它可能是假的,也可能根本不存在。问题是其他行也可能不存在。

现在我有这个:

(?:\n|.)*One:(?:\n|.)*?visible=true(?:\n|.)*

这可以判断One是否存在,但是如果它是假的,那么我的正则表达式只是从下列之一中获取一个真值,因为它们的格式相同。我不能把#"#"在我的正则表达式结束时,因为它可能不存在。

我怎么说"寻找' visible = true'在' #One之后:'但在下一个'#'之前只有有以下情况'#'"?

我可以使用非贪婪的捕获组来抓取下一个之后的任何内容" hidden ="在"#One"之后。但后来我有三个结果,真实,虚假和不匹配。这有点困难,因为我在Android应用程序" Tasker"哪个可以获得组或测试匹配但是两个都需要多个操作。而且tasker工作的方式使得很难获得捕获组而不会破坏我的文本,所以我需要更多的操作来克隆我的文本。

2 个答案:

答案 0 :(得分:0)

\bOne:(?:(?!\n#\w+)[\s\S])*?\bvisible=true[\s\S]*?(?=\n#\w+|$)

试试这个。看看演示。

https://regex101.com/r/nS2lT4/15

答案 1 :(得分:0)

你需要非贪婪的任何东西 - 但是哈希序列 - [^#]*?。这也需要是多行并匹配换行符,因此(?ms)标志:

(?ms)#One:[^#]*?visible=true

以下是它的工作原理: