这个问题已经困扰了我很长时间了,但本质上我正在寻找最有效的方法来抓住两个字符串之间的所有字符串。
我已经这样做了好几个月,现在是通过使用一堆临时索引,字符串,子字符串,它真的很乱(为什么java没有一个本机方法,比如 String substring(String start, String end)
?
假设我有一个字符串: [pattern1]foo[pattern2] defg [pattern1]bar[pattern2] morestuff
最终目标是产出 foo
以及 bar
. (稍后添加到jlist中)
我一直在尝试把regex合并到 .split()
但没有成功。我试过使用语法 *
的和 .
但我不认为我的意图是什么,特别是自从 .split()
只需要一个论点来反对。
否则我认为另一种方法是使用pattern和matcher类?但我对合适的程序还不太清楚。
3条答案
按热度按时间8iwquhpp1#
试试这个:
它打印:
xzlaal3s2#
这里有一条线可以做到这一切:
细分为:
删除pattern1之前的所有内容(要求不要以空字符串作为第一项结束)
按输入拆分(非贪婪)
.*?
)在模式2和模式1之间(或输入端)使用实用方法
Arrays.asList()
生成一个List<String>
下面是一些测试代码:输出:
d7v8vwbk3#
您可以构造正则表达式来执行以下操作:
这将治疗
pattern1
以及pattern2
作为文本,模式之间的文本在第一个捕获组中捕获。您可以删除Pattern.quote()
如果你想用正则表达式,但我不保证你会这么做。您可以通过将标志添加到
regexString
.如果您想要识别unicode不区分大小写的匹配,那么添加
(?iu)
年初regexString
,或供应Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE
标记到Pattern.compile
方法。如果要捕获内容(即使两个分隔字符串跨行出现),请添加
(?s)
之前(.*?)
,即。"(?s)(.*?)"
,或供应Pattern.DOTALL
标记到Pattern.compile
方法。然后编译正则表达式,得到
Matcher
对象,遍历匹配项并将它们保存到List
(或任何Collection
,由你决定)。测试代码:
请注意,如果您在
foo
以及bar
在此输入中foo text foo text bar text bar
使用上述方法,您将得到一个匹配项,即text foo text
.