Использование JTextField для получения регулярного выражения от пользователя. Как сделать так, чтобы \ t отображалось как вкладка, а не \, а затем - PullRequest
2 голосов
/ 08 февраля 2012
JTextField reSource; //contains the regex expression the user wants to search for
String re=reSource.getText();
Pattern p=Pattern.compile(re,myflags); //myflags defined elsewhere in code
Matcher m=p.matcher(src); //src is the text to search and comes from a JTextArea
while (m.find()==true) {
  • Если пользователь вводит \t, он находит \t, а не табуляцию.
  • Если пользователь вводит \\\t, он находит \\\t, а не табуляцию.
  • Если пользователь вводит [\t] или [\\\t], он находит t, а не tab.

Я хочу, чтобы, если пользователь вводит \t, он находит вкладку. Конечно, он также должен работать с \n, \r и т.д ...

Если вместо re=reSource.getText(); используется \t с *1026* в JTextField, то он находит вкладки. Как заставить его работать с содержимым JTextField?

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

Пример:

String src = "This\tis\ta\ttest";
System.out.println("src=\"" + src + '"'); // --> prints "This is a test"
String re="\\t";
System.out.println("re=\"" + re + '"'); // --> prints "\t" - as when you use reSource.getText();

Pattern p = Pattern.compile(re);
Matcher m = p.matcher(src);
while (m.find()) {
    System.out.println('"' + m.group() + '"');
}

Выход:

src="This   is  a   test"
re="\t"
"   "
"   "
"   "

Попробуйте это:

re=re.replace("\\t", "\t");
OR
re=re.replace("\\t", "\\\\t");

Я думаю, что проблема заключается в понимании того, что при вводе:

String str = "\t";

Тогда это действительно так же, как:

String str = "   ";

Но если вы введете:

String str = "\\t";

Тогда System.out.print (str) будет "\ t" .

1 голос
/ 08 февраля 2012

Соответствие \t должно работать, однако у ваших флагов может быть проблема.

Вот что мне подходит:

String src = "A\tBC\tD";
Pattern p=Pattern.compile("\\w\\t\\w"); //simulates the user entering \w\t\w
Matcher m=p.matcher(src);
while (m.find()) 
{
  System.out.println("Match: \"" + m.group(0) + "\"");
}

Вывод:

Match: "A   B"
Match: "C   D"
0 голосов
/ 25 июля 2013

Мой опыт показывает, что элементы управления Java Swing JTextField и JTable GUI экранируют введенные пользователем обратные косые черты с помощью префикса обратной косой черты.

Пользователь вводит двухсимвольную последовательность «обратная косая черта t», метод getText () элемента управления возвращает строку, содержащую трехсимвольную последовательность «обратная косая черта обратной косой черты t».Форматировщик SO делает свое дело с обратной косой чертой в тексте, поэтому здесь он выглядит как код:

  Single backslash: input is 2 char sequence \t and return value is 3 char \\t

Для трехсимвольной входной последовательности "backsl backsl t", getText () возвращает пятисимвольную последовательность "backslbacksl backsl backsl t ".Как код:

  Double backslash: input is 3 char sequence \\t and return value is 5 char \\\\t

Это в основном не позволяет обратной косой черте изменять t, чтобы получить последовательность символов, которая становится вкладкой, когда интерпретируется чем-то вроде System.out.println.

Удобно, иУдивительно для меня, процессор регулярных выражений принимает его в любом случае .Двухсимвольная последовательность «\ t» соответствует символу табуляции, как и трехсимвольная последовательность «\\ t».Пожалуйста, посмотрите демо-код ниже.Вызовы system.out показывают, какие последовательности и шаблоны имеют вкладки, и в JDK 1.7 оба совпадения дают значение true.

package my.text;

/**
 * Demonstrate use of tab character in regexes
 */
public class RegexForSo {
public static void main(String [] argv) {
    final String sequenceTab="x\ty\tz";
    final String patternBsTab = "x\t.*";
    final String patternBsBsTab = "x\\t.*";
    System.out.println("sequence is >" + sequenceTab + "<");
    System.out.println("pattern BsTab is >" + patternBsTab + "<");
    System.out.println("pattern BsBsTab is >" + patternBsBsTab + "<");
    System.out.println("matched BsTab = " + sequenceTab.matches(patternBsTab));
    System.out.println("matched BsBsTab = " + sequenceTab.matches(patternBsBsTab));     
  }
}

Вывод в моей системе JDK1.7 приведен ниже, вкладки ввыходные данные могут не сохраниться ТАК форматер:)

sequence is >x  y   z<
pattern BsTab is >x .*<
pattern BsBsTab is >x\t.*<
matched BsTab = true
matched BsBsTab = true

HTH

...