Как извлечь данные между двумя символами в Java - PullRequest
0 голосов
/ 23 сентября 2018
String text = "/'Team1 = 6', while /'Team2 = 4', and /'Team3 = 2'";

String[] body = text.split("/|,");
String b1 = body[1];
String b2 = body[2];
String b3 = body[3];

Желаемые результаты:

b1 = 'Team1 = 6'
b2 = 'Team2 = 4'
b3 = 'Team3 = 2'

Ответы [ 6 ]

0 голосов
/ 23 сентября 2018

Вы можете использовать split и регулярное выражение, используя чередование , совпадающее либо с началом строки, после которого следует косая черта, либо с запятой, но не с запятой один или несколько раз, а затем с косой чертой.положительным прогнозом , чтобы утверждать, что то, что следует за чередованием, является '

(?:^/|,[^,]+/)(?=')

Объяснение

  • (?: Начало группы без захвата
    • ^/ Утверждение начала строки с последующей косой чертой
    • | Или
    • ,[^,]+/ Соответствует aзапятая, за которой следует сопоставление, а не запятая один или несколько раз с использованием отрицательного класса символов , а затем сопоставление с косой чертой
    • (?=') Позитивный прогноз, подтверждающий следующее: '
  • ) Закрыть группу без захвата

Regex demo - Java demo

Получение совпадения вместо разделения

Если вы хотите сопоставить шаблон как 'Team1 = 6', вы можетеследует использовать:

'[^=]+=[^']+'

Regex demo - Java demo

0 голосов
/ 23 сентября 2018
public class MyClass {
    public static void main(String args[]) {
        String text = "/'Team1 = 6', while /'Team2 = 4', and /'Team3 = 2'";
        char []textArr = text.toCharArray();
        char st = '/';
        char ed = ',';


        boolean lookForEnd = false;
        int st_idx =0;
        for(int i =0; i < textArr.length; i++){
            if(textArr[i] == st){
                st_idx = i+1;
                lookForEnd = true;
            }
            else if(lookForEnd && textArr[i] == ed){
                System.out.println(text.substring(st_idx,i));
                lookForEnd = false;
            }
        }

        // we still didn't find ',' therefore print everything from lastFoundIdx of '/'
        if(lookForEnd){
           System.out.println(text.substring(st_idx)); 
        }

    }  
}

/*

'Team1 = 6'
'Team2 = 4'
'Team3 = 2'

*/
0 голосов
/ 23 сентября 2018

Вы можете разделить на «косую черту, необязательно с запятой, за которой следует ноль или более не косых черт»:

String[] body = text.split("(?:,[^/]*)?/");
0 голосов
/ 23 сентября 2018

Я скажу "друзья не позволяют друзьям использовать регулярные выражения" и рекомендую разобрать это.Встроенный класс StreamTokenizer будет обрабатывать задание.

   private static void testTok( String in ) throws Exception {
      System.out.println( "Input: " + in );
      StreamTokenizer tok = new StreamTokenizer( new StringReader( in ) );
      tok.resetSyntax();
      tok.wordChars( 'a', 'z' );
      tok.wordChars( 'A', 'Z' );
      tok.wordChars( '0', '9' );
      tok.whitespaceChars( 0, ' ' );
      String prevToken = null;
      for( int type; (type = tok.nextToken()) != StreamTokenizer.TT_EOF; ) {
//         System.out.println( tokString( type ) + ":  nval=" + tok.nval + ", sval=" + tok.sval );
         if( type == '=' ) {
            tok.nextToken();
            System.out.println( prevToken + "=" + tok.sval );
         }
         prevToken = tok.sval;
      }
   }

Вывод:

Input: /'Team1 = 6', while /'Team2 = 4', and /'Team3 = 2'
Team1=6
Team2=4
Team3=2
BUILD SUCCESSFUL (total time: 0 seconds)

Одним из преимуществ этого метода является то, что отдельные токены, такие как "Team1", "="и" 6 все анализируются отдельно, в то время как представленное до сих пор регулярное выражение уже сложно для чтения и должно быть еще более сложным, чтобы выделить каждый из этих токенов в отдельности.

0 голосов
/ 23 сентября 2018

Используйте регулярное выражение.Примерно так:

String text = "/'Team1 = 6', while /'Team2 = 4', and /'Team3 = 2'";
Matcher m = Pattern.compile("(\\w+\\s=\\s\\d+)").matcher(text); 
// \w+ matches the team name (eg: Team1). \s=\s matches " = " and \d+ matches the score.
while (m.find()){
    System.out.print(m.group(1)+"\n");
}

Это печатает:

Team1 = 6

Team2 = 4

Team3 = 2

0 голосов
/ 23 сентября 2018

Есть несколько способов сделать это, но в вашем случае я бы использовал regex .

Я не знаю Java, но думаю, что-то вроде этого шаблона регулярных выражений должно работать:

Pattern compile("\/'(.*?)'")

Здесь находится случайный тестировщик регулярных выражений с этим шаблоном: https://regex101.com/r/MCRfMm/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...