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();
代替\t
而JTextField
,则会找到标签。如何使用JTextField
?
答案 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