【问题标题】:Extract substring from a long string using starting string and ending string?使用起始字符串和结束字符串从长字符串中提取子字符串?
【发布时间】:2014-12-29 11:10:01
【问题描述】:

我有这个长字符串(它是一个长而连续的字符串):

Home address H.NO- 12 SECTOR- 12 GAUTAM BUDH NAGAR NOIDA- 121212, UTTAR PRADESH INDIA +911112121212 Last Updated: 12-JUN-12 Semester/Term-time Accommodation Type: Hall of residence (private provider) Semester/Term-time address A121A SOME APPARTMENT SOME LANE CITY COUNTY OX3 7FJ +91 1212121212 Last Updated: 12-SEP-12 Mobile Telephone Number : 01212121212

如果你看上面的字符串,可以产生以下模式:

<home_address_text><space><the_address><space><last_updated_text><last_updated_date><space><accomodation_t‌​ype_text><accomodation_type><space><semester_time_address_text><semester_time_address><space>last_updated_text><last_updated_date><space><mobile_number_text><mobile_number>

我想提取此字符串的特定部分,例如: 1. H.NO- 12 SECTOR- 12 GAUTAM BUDH NAGAR NOIDA- 121212, UTTAR PRADESH INDIA 2. Hall of residence (private provider) 3. A121A SOME APARTMENT SOMELANE CITY COUNTY OX3 7FJ 4. 01212121212

这个信息是可变的,所以它因人而异,所以我不能只计算长度并使用子字符串来提取它,因为整个字符串的长度&我要提取的部分是可变的。

如上所述,如何使用 Java 提取字符串的特定部分?很久以来我一直在寻找方法,但找不到方法。任何帮助将不胜感激

【问题讨论】:

  • 您需要更好地解释输入数据格式。鉴于您似乎在暗示什么,可能没有一个好的方法来做到这一点。我希望你每行有一个条目,否则这几乎是不可能的。
  • @markspace 输入是一个字符串
  • 用一个例子很难找到一个模式(在广泛的主线中)。
  • @coderrio 这不是答案。
  • 这个字符串有什么规律?你能描述一下它的模式/格式吗?

标签: java regex string substring


【解决方案1】:
Home\s+address\s+(.*?)Last\s+Updated(.*?)Accommodation\s+Type(.*?)Semester\/Term-time(.*?)Last\s+Updated(.*)Mobile\s+Telephone\s+Number\s*:\s*(\d+)

试试这个。抓住捕获。查看演示。

http://regex101.com/r/jI8lV7/7

【讨论】:

    【解决方案2】:

    根据您的(单个)示例,这对我有用。学习将reluctant modifiers 用于正则表达式。在这种情况下,它们会为您提供很多帮助。

    例如,要获取字符串以匹配第一部分:"Home address (.+?) \+\d+ Last Updated: 此正则表达式不会跳过我们不想要的“上次更新”字符串或“+dd”(数字)。正则表达式“(.+?)”是不情愿的(不是贪婪的),不会跳过 + 号或数字,让它们与表达式的其余部分匹配。

    您可以使用它来匹配被静态文本包围的正则表达式中的子字符串。在这里,我使用捕获组来定位我想要的文本。 (捕获组是括号中的部分。)

    class Goofy
    {
    
       public static void main( String[] args )
       {
          final String input
                  = "Home address H.NO- 12 SECTOR- 12 GAUTAM BUDH NAGAR " +
                  "NOIDA- 121212, UTTAR PRADESH INDIA +911112121212 " +
                  "Last Updated: 12-JUN-12 Semester/Term-time " +
                  "Accommodation Type: Hall of residence (private " +
                  "provider) Semester/Term-time address A121A SOME " +
                  "APPARTMENT SOME LANE CITY COUNTY OX3 7FJ +91 " +
                  "1212121212 Last Updated: 12-SEP-12 Mobile Telephone " +
                  "Number : 01212121212";
    
          final String regex = "Home address (.+?) \\+\\d+ Last Updated: " +
                  "\\S+ Semester/Term-time Accommodation Type: (.+?) " +
                  "Semester/Term-time address (.+?) \\+\\d\\d \\d+ " +
                  "Last Updated.+ Number : (\\d+)";
    
          Pattern pattern = Pattern.compile( regex );
          Matcher matcher = pattern.matcher( input );
          if( matcher.find() ) {
             System.out.println("Found: "+matcher.group() );
             for( int i = 1; i <= matcher.groupCount(); i++ ) {
                System.out.println( "   Match " + i + ": " + matcher.group( i ));
             }
          }
       }
    }
    

    【讨论】:

    • 您的正则表达式和不情愿的量词走在正确的轨道上,但在您的 impl 中脱轨了。为什么将所有这些文本添加到您的模式中?另外,如果只有一个目标匹配,你只需要一行代码:str = str.replaceAll("Home address (.+?) \+\d+ Last Updated", "$1");
    • 没有一个目标匹配,有四个。阅读源代码(和 OP)。
    • 你仍然可以在一行中完成 :)
    【解决方案3】:

    利用来自http://www.tutorialspoint.com/java/java_regular_expressions.htm 的示例 我想你会想要使用正则表达式。比如:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegexMatches
    {
        public static void main( String args[] ){
    
          // String to be scanned to find the pattern.
          String line = "Home address H.NO- 12 SECTOR- 12 GAUTAM BUDH NAGAR NOIDA- 121212, UTTAR PRADESH INDIA +911112121212 Last Updated: 12-JUN-12 Semester/Term-time Accommodation Type: Hall of residence (private provider) Semester/Term-time address A121A SOME APPARTMENT SOME LANE CITY COUNTY OX3 7FJ +91 1212121212 Last Updated: 12-SEP-12 Mobile Telephone Number : 01212121212";
          String pattern = "Home address (.*) Last Updated:";
    
          // Create a Pattern object
          Pattern r = Pattern.compile(pattern);
    
          // Now create matcher object.
          Matcher m = r.matcher(line);
          if (m.find( )) {
             System.out.println("Found value: " + m.group(0) );
          } else {
             System.out.println("NO MATCH");
          }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      相关资源
      最近更新 更多