【问题标题】:Regex expression to capture hyphenated word between lines, and non hyphenated words正则表达式捕获行之间的连字符和非连字符
【发布时间】:2012-06-27 21:53:55
【问题描述】:

我正在尝试在 java 中编写一个匹配单词和连字符的正则表达式。到目前为止,我有:

Pattern p1 = Pattern.compile("\\w+(?:-\\w+)",Pattern.CASE_INSENSITIVE);
Pattern p2 = Pattern.compile("[a-zA-Z0-9]+",Pattern.CASE_INSENSITIVE);
Pattern p3 = Pattern.compile("(?<=\\s)[\\w]+-$",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

这是我的测试用例:

程式 Dsfasdf。程序 程序 Dsfasdf。 Dsfasdf。哇哇哇!哇。哇?好的。 他说:“嗨。” aasdfa. wsdfalsdjf.去去去- 至 asdfasdf .. , : ; " ' ( ) ? ! - / \ @ # $ % & ^ ~ ` * [ ] { } + _ 123

任何帮助都会很棒

我的预期结果是匹配所有单词 ie。

程序 Dsfasdf 程序 程序 Dsfasdf Dsfasdf 就像哇哇哇哇好的他说嗨aasdfa wsdfalsdjf go-to go-to asdfasdf

我正在努力的部分是将在行之间拆分的单词匹配为一个单词。

即。

去-
至

【问题讨论】:

  • 所以你想匹配带有和不带有连字符的单词?但不是标点符号或数字?您的测试用例的预期/期望结果也会很有用。
  • 我不太清楚你所说的“连字符行间”是什么意思。

标签: java regex match capture


【解决方案1】:
\p{L}+(?:-\n?\p{L}+)* \ /^\ /^\ /\ /^^^ \ / | | | | \ / ||| | | | | | | ||`- 前一个可以重复 0 次或多次(一组文字“-”、可选换行符和一个或多个任意字母(大写/小写)) | | | | | | |`-- 结束第一个非捕获组 | | | | | | `--- 匹配一个或多个前面的(任何字母,大写/小写) | | | | | `----- 匹配任何字母(大写/小写) | | | | `--------- 匹配单个换行符(可选,因为 `?`) | | | `------------ 字面量 '-' | | `------------- 启动第一个非捕获组 | `---------------- 匹配一个或多个前面的(A-Z(大写/小写)之间的任何字母) `-------------------- 匹配任意字母(大写/小写)

Is this OK?

【讨论】:

  • 是自动生成的吗?如果是这样,这是从哪里来的?
  • 单词在两行之间分开怎么办?在我的测试用例中,go-to 分为两行。我的问题中确实有(基本上)作为 p1 减去 ?最后。
  • 没有意识到它应该是有效的。更新了正则表达式以反映请求的更改。
【解决方案2】:

我会使用正则表达式:

\p{L}+(?:\-\p{L}+)*

这样的正则表达式还应该匹配单词 "fiancé""À-la-carte" 和其他包含一些特殊类别“字母”字符的单词。 \p{L} 匹配“字母”类别中的单个代码点。

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多