使用JTextField从用户获取正则表达式。如何让它看作\ tab作为选项卡而不是\后跟t

时间:2012-02-08 12:29:46

标签: java regex swing jtextfield

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而不是标签。

我希望如果用户输入\t它找到标签。当然,它还需要使用\n\r等...

如果在re="\t";中使用re=reSource.getText();代替\tJTextField,则会找到标签。如何使用JTextField

的内容

3 个答案:

答案 0 :(得分:1)

匹配\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"

答案 1 :(得分:1)

示例:

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”

答案 2 :(得分:0)

我的经验是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()返回五个字符的序列“backsl backsl 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 匹配yield 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系统上的输出如下,输出中的标签可能无法在SO格式化程序中存活:)

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

HTH