java—抓取两个字符串之间所有字符串的最佳方法(正则表达式?)

nx7onnlm  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(309)

这个问题已经困扰了我很长时间了,但本质上我正在寻找最有效的方法来抓住两个字符串之间的所有字符串。
我已经这样做了好几个月,现在是通过使用一堆临时索引,字符串,子字符串,它真的很乱(为什么java没有一个本机方法,比如 String substring(String start, String end) ?
假设我有一个字符串: [pattern1]foo[pattern2] defg [pattern1]bar[pattern2] morestuff 最终目标是产出 foo 以及 bar . (稍后添加到jlist中)
我一直在尝试把regex合并到 .split() 但没有成功。我试过使用语法 * 的和 . 但我不认为我的意图是什么,特别是自从 .split() 只需要一个论点来反对。
否则我认为另一种方法是使用pattern和matcher类?但我对合适的程序还不太清楚。

8iwquhpp

8iwquhpp1#

试试这个:

  1. String str = "its a string with pattern1 aleatory pattern2 things between pattern1 and pattern2 and sometimes pattern1 pattern2 nothing";
  2. Matcher m = Pattern.compile(
  3. Pattern.quote("pattern1")
  4. + "(.*?)"
  5. + Pattern.quote("pattern2")
  6. ).matcher(str);
  7. while(m.find()){
  8. String match = m.group(1);
  9. System.out.println(">"+match+"<");
  10. //here you insert 'match' into the list
  11. }

它打印:

  1. > aleatory <
  2. > and <
  3. > <
展开查看全部
xzlaal3s

xzlaal3s2#

这里有一条线可以做到这一切:

  1. List<String> strings = Arrays.asList( input.replaceAll("^.*?pattern1", "")
  2. .split("pattern2.*?(pattern1|$)"));

细分为:
删除pattern1之前的所有内容(要求不要以空字符串作为第一项结束)
按输入拆分(非贪婪) .*? )在模式2和模式1之间(或输入端)
使用实用方法 Arrays.asList() 生成一个 List<String> 下面是一些测试代码:

  1. public static void main( String[] args ) {
  2. String input = "abcabc pattern1foopattern2 abcdefg pattern1barpattern2 morestuff";
  3. List<String> strings = Arrays.asList( input.replaceAll("^.*?pattern1", "").split("pattern2.*?(pattern1|$)"));
  4. System.out.println( strings);
  5. }

输出:

  1. [foo, bar]
展开查看全部
d7v8vwbk

d7v8vwbk3#

您可以构造正则表达式来执行以下操作:

  1. // pattern1 and pattern2 are String objects
  2. String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

这将治疗 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 ,由你决定)。

  1. Pattern pattern = Pattern.compile(regexString);
  2. // text contains the full text that you want to extract data
  3. Matcher matcher = pattern.matcher(text);
  4. while (matcher.find()) {
  5. String textInBetween = matcher.group(1); // Since (.*?) is capturing group 1
  6. // You can insert match into a List/Collection here
  7. }

测试代码:

  1. String pattern1 = "hgb";
  2. String pattern2 = "|";
  3. String text = "sdfjsdkhfkjsdf hgb sdjfkhsdkfsdf |sdfjksdhfjksd sdf sdkjfhsdkf | sdkjfh hgb sdkjfdshfks|";
  4. Pattern p = Pattern.compile(Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2));
  5. Matcher m = p.matcher(text);
  6. while (m.find()) {
  7. System.out.println(m.group(1));
  8. }

请注意,如果您在 foo 以及 bar 在此输入中 foo text foo text bar text bar 使用上述方法,您将得到一个匹配项,即  text foo text  .

展开查看全部

相关问题