2011-11-20 19 views
2

之间获取代码我怎样才能得到正则表达式 - 两点意见

Text t; 
Graph g; 

// Co 
Text t; 
Graph g; 
// Co 

// Co\r?\n(.*)\r?\n// Co 

工作时有一条线,但不适用于多行。

+0

您确定使用它是安全的吗?如果你在字符串中有第二个// Co,该怎么办? – Tudor

+0

// Co和// Co之间始终是var声明。 – OnTheFly

回答

5

默认情况下,.与除换行符(\n)之外的任何字符匹配,但您也可以使用the Pattern.DOTALL flag使其与换行符匹配。因此,例如,而不是这样的:等价

final Pattern pat = Pattern.compile("// Co\r?\n(.*)\r?\n// Co", Pattern.DOTALL); 

,您可以设置正则表达式本身内部的s标志,使用这两种风格:

final Pattern pat = Pattern.compile("// Co\r?\n(.*)\r?\n// Co"); 

你会使用这个

final Pattern pat = Pattern.compile("// Co\r?\n((?s).*)\r?\n// Co"); 
final Pattern pat = Pattern.compile("// Co\r?\n(?s:(.*))\r?\n// Co"); 

它允许您控制正则表达式的哪个部分接受.的换行符。 (不过我倒是与DOTALL办法坚持,除非你有一个正则表达式,其中.有时意味着一两件事,有时是其他。)

编辑补充:这似乎很可能—但你必须确定这对你自己来说,根据你的使用案例—你需要用非贪心量化,.*?,而不是贪心量化,.*

+0

http://pastebin.com/510dvh7y当我运行它时http://pastebin.com/1sura6uP – OnTheFly

+1

这是因为如果模式匹配*整个*字符串,Matcher.matches()只返回“true”。您的测试字符串以'// Co \ n'结尾;模式中没有任何内容匹配换行符。我假设你真正想要的是'Matcher.find()',如果模式匹配字符串的任何*部分*,则返回'true'。 – ruakh