0

我有一段代码:

String textFieldContents = myJTextField.getText(); // javax.swing.JTextField

// If two consecutive pipes exist in the text, or if the text ends with a pipe, print a statement.
if(textFieldContents.matches("||") || textFieldContents.endsWith("|"))
    System.out.println("We have a winner!");

myJTextField文本字段(Swing 组件)为空且其中没有文本时,将We have a winner!打印文本。为什么?

4

4 回答 4

5

请注意,公共布尔匹配(字符串正则表达式)采用正则表达式

您需要转义特殊的 char |

(转义正则表达式由 完成\,但在 Java 中,\写为\\)。

您还可以使用Pattern#quote

textFieldContents.matches(Pattern.quote("|"));

请参阅@JimDagg 答案 (+1) 以了解为什么它在您的情况下总是返回true

于 2013-05-07T17:30:50.547 回答
1

管道字符是 Java 正则表达式中的特殊字符。它实际上是一个“或”。您的正则表达式最终会说“匹配零个字符或零个字符”,这在字符串中的任何地方都是正确的。在正则表达式中用反斜杠转义它可以解决问题......

但是Java字符串中的反斜杠也有特殊的含义,所以你必须转义转义管道的反斜杠!!您最终不得不使用\\|,这将导致正则表达式\|,它产生管道字符的匹配,|.

于 2013-05-07T17:34:22.747 回答
0

|是正则表达式中的一个特殊字符,您需要转义字符才能从字面上使用它们。如果您只想查看某处是否有两个连续的管道,您还需要吸收任何前置和尾随字符。

if(textFieldContents.matches(".*\\|\\|.*") || textFieldContents.endsWith("|"))
    System.out.println("We have a winner!");
于 2013-05-07T17:43:34.313 回答
0

String.matches()使用正则表达式匹配输入字符串。在正则表达式中,'|' 具有特殊含义,它(用作 ORing)。所以你需要明确地转义这个特殊字符以避免被用作特殊字符。

使用这样的东西:

if(textFieldContents.matches("\\|\\|"))
于 2013-05-07T17:33:01.057 回答