Search code examples
javaregexswingjtextfield

Using a JTextField to get a regular expression from a user. How do I make it see \t as a tab instead of a \ followed by a t


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) {
  • If the user enters \t it finds \t not tab.
  • If the user enters \\\t it finds \\\t not tab.
  • If the user enters [\t] or [\\\t] it finds t not tab.

I want it such that if the user enters \t it finds tab. Of course it also needs to work with \n, \r etc...

If re="\t"; is used instead of re=reSource.getText(); with \t in the JTextField then it finds tabs. How do I get it to work with the contents of the JTextField?


Solution

  • Example:

    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() + '"');
    }
    

    Output:

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

    Try this:

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

    I think the problem is in understanding that when you type:

    String str = "\t";
    

    Then it is actualy same as:

    String str = "   ";
    

    But if you type:

    String str = "\\t";
    

    Then the System.out.print(str) will be "\t".