Как я маркирую вход с помощью класса Сканера Java и регулярных выражений?

1.Если возможно преобразовать тип данных ZipCode из nvarchar в bigint.
2.три группы по ZipCode

 SELECT ZipCode FROM Address GROUP BY ZipCode;
5
задан eplawless 20 April 2012 в 12:58
поделиться

4 ответа

Имя "Сканер" является немного вводящим в заблуждение, потому что слово часто используется для значения лексического анализатора, и это не то, для чего Сканер. Все, что это, является заменой scanf() функционируйте Вы находите в C, Perl, и др. Как StringTokenizer и split(), это разработано для сканирования вперед, пока это не находит достойным данного шаблона, и независимо от того, что это перескочило на пути, возвращается как маркер.

Лексический анализатор, с другой стороны, должен исследовать и классифицировать каждый символ, даже если это только, чтобы решить, может ли он безопасно проигнорировать их. Это означает, после каждого соответствия это может применить несколько шаблонов, пока это не находит тот, который соответствует запуску в той точке. Иначе это может найти последовательность "//" и думать, что нашло начало комментария, когда это действительно в строковом литерале, и этому просто не удалось заметить вводную кавычку.

Это на самом деле намного более сложно, чем это, конечно, но я просто иллюстрирую почему встроенные инструменты как StringTokenizer, split() и Сканер не подходит для этого вида задачи. Однако, возможно использовать regex классы Java для ограниченной формы лексического анализа. На самом деле добавление класса Сканера сделало это намного легче из-за нового API Matcher, который был добавлен для поддержки его, т.е. регионы и usePattern() метод. Вот пример элементарного сканера, созданного сверху regex классов Java.

import java.util.*;
import java.util.regex.*;

public class RETokenizer
{
  static List<Token> tokenize(String source, List<Rule> rules)
  {
    List<Token> tokens = new ArrayList<Token>();
    int pos = 0;
    final int end = source.length();
    Matcher m = Pattern.compile("dummy").matcher(source);
    m.useTransparentBounds(true).useAnchoringBounds(false);
    while (pos < end)
    {
      m.region(pos, end);
      for (Rule r : rules)
      {
        if (m.usePattern(r.pattern).lookingAt())
        {
          tokens.add(new Token(r.name, m.start(), m.end()));
          pos = m.end();
          break;
        }
      }
      pos++;  // bump-along, in case no rule matched
    }
    return tokens;
  }

  static class Rule
  {
    final String name;
    final Pattern pattern;

    Rule(String name, String regex)
    {
      this.name = name;
      pattern = Pattern.compile(regex);
    }
  }

  static class Token
  {
    final String name;
    final int startPos;
    final int endPos;

    Token(String name, int startPos, int endPos)
    {
      this.name = name;
      this.startPos = startPos;
      this.endPos = endPos;
    }

    @Override
    public String toString()
    {
      return String.format("Token [%2d, %2d, %s]", startPos, endPos, name);
    }
  }

  public static void main(String[] args) throws Exception
  {
    List<Rule> rules = new ArrayList<Rule>();
    rules.add(new Rule("WORD", "[A-Za-z]+"));
    rules.add(new Rule("QUOTED", "\"[^\"]*+\""));
    rules.add(new Rule("COMMENT", "//.*"));
    rules.add(new Rule("WHITESPACE", "\\s+"));

    String str = "foo //in \"comment\"\nbar \"no //comment\" end";
    List<Token> result = RETokenizer.tokenize(str, rules);
    for (Token t : result)
    {
      System.out.println(t);
    }
  }
}

Это, между прочим, является единственным хорошим использованием, которое я когда-либо находил для lookingAt() метод.:D

13
ответ дан 18 December 2019 в 07:32
поделиться

Если я понимаю, что Вашим вопросом хорошо затем вот являются два метода в качестве примера для маркирования строки. Вам даже не нужен класс Сканера, только если Вы хотите к сборному маркеры или выполняете итерации через них более софистски, чем использование массива. Если массив является достаточно просто использованием String.split (), как дали ниже.

Дайте больше требований для включения более точных ответов.

 import java.util.Scanner;


  public class Main {    

    public static void main(String[] args) {

        String textToTokenize = "This is a text that will be tokenized. I will use 1-2 methods.";
        Scanner scanner = new Scanner(textToTokenize);
        scanner.useDelimiter("i.");
        while (scanner.hasNext()){
            System.out.println(scanner.next());
        }

        System.out.println(" **************** ");
        String[] sSplit = textToTokenize.split("i.");

        for (String token: sSplit){
            System.out.println(token);
        }
    }

}
3
ответ дан 18 December 2019 в 07:32
поделиться

Если это для простого проекта (для изучения, как вещи работают), то пойдите с тем, что заявил Balint Pato.

Если это для большего проекта, рассмотрите использование генератора сканера как JFlex вместо этого. Несколько более сложный, но быстрее и более мощный.

2
ответ дан 18 December 2019 в 07:32
поделиться

Большинство ответов здесь уже превосходны, но я был бы упущен, если бы не указал ANTLR . Я создал целые компиляторы вокруг этого прекрасного инструмента. Версия 3 имеет несколько удивительных функций, и я бы рекомендовал ее для любого проекта, который требовал от вас синтаксического анализа вводимых данных на основе четко определенной грамматики.

3
ответ дан 18 December 2019 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: