【问题标题】:Regex to match words of a certain length正则表达式匹配一定长度的单词
【发布时间】:2012-02-21 01:31:30
【问题描述】:

我想知道匹配单词的正则表达式,以使单词具有最大长度。 例如,如果一个单词的长度最大为 10 个字符,我希望正则表达式匹配,但如果长度超过 10,则正则表达式不应该匹配。

我试过了

^(\w{10})$

但只有当单词的最小长度为 10 个字符时,我才会匹配。如果单词超过 10 个字符,它仍然匹配,但只匹配前 10 个字符。

【问题讨论】:

  • 您是否有理由不想简单地迭代单词并使用String.length()
  • 是的。这个字符串是一个更大的字符串的一部分,该字符串包含多种格式的单词 - 日期、电子邮件、网址等,所有这些都采用制表符分隔的格式。我正在考虑编写一个复合正则表达式来匹配整行。
  • 我明白了。由于单词是由制表符分隔的,是不是可以拆分它们(使用String.split()StringTokenizer),然后查看每个单词的长度?
  • 很有可能。事实上,起初这是我的想法,但使用正则表达式似乎很简单...... :)

标签: java regex


【解决方案1】:

我想你想要\b\w{1,10}\b\b 匹配单词边界。

当然,您也可以替换 \b 并替换为 ^\w{1,10}$。这将匹配最多 10 个字符的单词,只要它是字符串的唯一内容。我想这就是你之前所做的。

由于它是 Java,因此您实际上必须转义反斜杠:"\\b\\w{1,10}\\b"。你可能已经知道了,但我之前就知道了。

【讨论】:

  • 谢谢。我确定转义以前也让我知道.. :0 如果单词大于 10,您提供的表达式匹配 10 个字符。如果单词超过 10 个字符,我不希望它匹配。有点与 \w{10,} 相反,你可以说...!
  • @AnandHemmige:哪个表情?如果单词中有超过 10 个字符,则带有 \b 的那个不应该匹配任何内容。以$ 结尾的那个也是如此。如果字符串只有一个单词,您应该尝试后者。
  • 在我的 VI 版本(gvim for Windows)中,{ 之前需要一个反斜杠 (\) 才能正常工作。
  • 查找不是特定字符长度的单词的正则表达式是什么?
【解决方案2】:
^\w{0,10}$ # allows words of up to 10 characters.
^\w{5,}$   # allows words of more than 4 characters.
^\w{5,10}$ # allows words of between 5 and 10 characters.

【讨论】:

  • 我希望其中的第一个可以作为 \w{10,} 的反面工作,但它没有。
  • ^$ 将正则表达式锚定到字符串的开头和结尾。如果要提取子匹配(一定长度的单词),则需要使用\b 单词边界锚点代替它们:\b\w{1,10}\b 将找到长度为 1 到 10 的单词。
  • 如何声明“允许 9 或 12 个字符的单词”的正则表达式?
  • @LoiNguyenHuynh:^(?:\w{9}|\w{12})$
  • @TimPietzcker 我自己试过了^\w{9}|\w{12}$,但没用大声笑,原来是我需要捕获( )
【解决方案3】:

要匹配的字符长度。

{n,m}  n <= length <= m
{n}    length == n
{n,}   length >= n

默认情况下,引擎会贪婪地匹配此模式。例如,如果输入是 123456789,\d{2,5} 将匹配长度为 5 的 12345。

如果您希望引擎在匹配长度 2 时返回,请使用 \d{2,5}?

【讨论】:

  • 这对我很有用,因为我正在寻找正则表达式来查找大于 x 的单词。
【解决方案4】:

方法一

单词边界在这里可以很好地发挥作用,例如:

\b\w{3,8}\b
\b\w{2,}
\b\w{,10}\b
\b\w{5}\b

RegEx Demo 1

Java

Java 和 C++ 等一些语言需要双转义:

\\b\\w{3,8}\\b
\\b\\w{2,}
\\b\\w{,10}\\b
\\b\\w{5}\\b

PS:\\b\\w{,10}\\b 可能不适用于所有语言或风格。

测试 1

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){


        final String regex = "\\b\\w{3,8}\\b";
        final String string = "words with length three to eight";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
        }

    }
}

输出 1

Full match: words
Full match: with
Full match: length
Full match: three
Full match: eight

方法二

另一个值得了解的方法是使用否定环视:

(?<!\w)\w{3,8}(?!\w)
(?<!\w)\w{2,}
(?<!\w)\w{,10}(?!\w)
(?<!\w)\w{5}(?!\w)

Java

(?<!\\w)\\w{3,8}(?!\\w)
(?<!\\w)\\w{2,}
(?<!\\w)\\w{,10}(?!\\w)
(?<!\\w)\\w{5}(?!\\w)

RegEx Demo 2

测试 2

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){


        final String regex = "(?<!\\w)\\w{1,10}(?!\\w)";
        final String string = "words with length three to eight";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
        }

    }
}

输出 2

Full match: words
Full match: with
Full match: length
Full match: three
Full match: to
Full match: eight

正则表达式电路

jex.im 可视化正则表达式:


如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入匹配。


【讨论】:

    【解决方案5】:

    即使,我也在寻找相同的正则表达式,但我也想包含所有特殊字符和空格。所以这里是正则表达式:

    ^[A-Za-z0-9\s$&+,:;=?@#|'<>.^*()%!-]{0,10}$
    

    【讨论】:

    • 这与“^.{0,10}$”有何不同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多