【问题标题】:Using Scanner.useDelimeter() in Java to isolate tokens in an expression在 Java 中使用 Scanner.useDelimeter() 隔离表达式中的标记
【发布时间】:2013-04-13 20:16:30
【问题描述】:

我试图从以下输入中分离出单词、括号和=><=>

(<=>A B) OR (C AND D) AND(A AND C)

到目前为止,我只是分离出单词(参见Scanner#useDelimeter()):

sc.useDelimeter("[^a-zA-Z]");

使用时:

sc.useDelimeter("[\\s+a-zA-Z]");

我只得到括号的输出。

我不想要但想要AND )

我该怎么做?执行\\s+ 会得到相同的结果。

另外,分隔符与正则表达式有何不同?我熟悉 PHP 中的正则表达式。使用的符号是一样的吗?

我想要的输出:

(
<=>
A
(and so on)

【问题讨论】:

  • 我不清楚,你期望的输出到底是什么?
  • 对于输入,我想要:( A B etc
  • 必须使用分隔符吗? Patter/Matcher 在这里看起来很完美。
  • 谢谢,我会试试的。
  • 由于\W 是否定的\w,它 匹配() 等等。我认为使用硬编码的&lt;=&gt; 和其他是可以的。此外,这使您的正则表达式更具可读性。

标签: java regex delimiter


【解决方案1】:

您需要一个宽度为零的 delimitimg 正则表达式(因为您有相邻的术语),因此环顾四周是唯一的选择。试试这个:

sc.useDelimeter("((?<=[()>])\\s*)|(\\s*\\b\\s*)");

此正则表达式表示“在括号或大于或在单词边界处,丢弃空格”


另请注意,字符类[\\s+a-zA-Z] 包括+ 字符 - 大多数字符在字符类中失去任何特殊的正则表达式含义。您似乎是想说“一个或多个空格”,但您不是这样说的。

【讨论】:

  • 非常好!但它仍然匹配" )"" (" 你能改进它吗?
  • sc.useDelimeter("((?&lt;=[()&gt;])\\s*)|(\\s*\\b\\s*)") 怎么样?
【解决方案2】:

[] 内部,^ 表示“不”,所以第一个正则表达式[^a-zA-Z] 表示“给我所有不是 a-z 或A-Z 的东西”

第二个正则表达式[\\s+a-zA-Z] 表示“给我所有空格、+、a-z 或 A-Z 的东西”。请注意,“+”在字符类中是文字加号。

【讨论】:

  • 谢谢,但是当使用 [^a-zA-Z] 时,我怎么会得到所有的单词?我不应该得到所有不是单词的东西吗?
  • 什么是sc?无论如何,您将分隔符设置为正则表达式的值,因此,如果您将其设置为,例如,“A”,您将获得所有 不是 A,在 A 上标记.
  • 抱歉,是扫描仪。
  • 我是这么想的,但是Scanner没有参数化的delimiter方法...
  • 实际上该方法是useDelimiter,并且每次匹配模式时都会破坏String
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2021-02-28
  • 2019-08-10
相关资源
最近更新 更多