正则表达式匹配一定长度的单词


78

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

我试过了

^(\w{10})$

但这仅在单词的最小长度为10个字符的情况下为我带来匹配。如果单词超过10个字符,它仍然匹配,但仅匹配前10个字符。


为什么您不想简单地遍历单词并使用String.length()呢?
MAK 2012年

1
是。此字符串是一个较大的字符串的一部分,该字符串包含以制表符分隔的格式的几种格式的单词-日期,电子邮件,URL等。我正在考虑编写一个复合正则表达式以匹配整行。
Anand Hemmige 2012年

我懂了。由于单词由制表符分隔,是否有可能将它们分开(使用String.split()StringTokenizer),然后查看每个单词的长度?
MAK 2012年

很有可能。事实上,起初这是我的想法,但是随后使用正则表达式似乎很简单.. :)
Anand Hemmige 2012年

Answers:


84

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

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

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


谢谢。我肯定也早已逃脱了。.:0如果单词大于10,则您提供的表达式匹配10个字符。如果单词超过10个字符,我不希望它匹配。\ w {10,}可以说...!
Anand Hemmige 2012年

1
@AnandHemmige:哪个表情?\b如果单词中的字符超过10个,则带a的字符不应与任何字符匹配。以结尾的一个也是如此$。如果字符串只是一个单词,则应尝试使用后者。
蒂洪

1
在我的VI版本(适用于Windows的gvim)中,需要先使用反斜杠(\)才能{使其正常工作。
克里斯蒂安·巴拉

48
^\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}相对,但事实并非如此。
Anand Hemmige 2012年

5
^并将$正则表达式锚定到字符串的开头和结尾。如果你想提取子匹配(一定长度的话),那么你需要使用\b自己的位置字边界锚:\b\w{1,10}\b会发现长度为1的话,以10
蒂姆Pietzcker

如何声明“允许9个或12个字符的单词”的正则表达式?
黎·阮·汉

1
@LoiNguyenHuynh:^(?:\w{9}|\w{12})$
Tim Pietzcker

@TimPietzcker我尝试了一下^\w{9}|\w{12}$,但没有成功,大声笑,原来是我需要捕获( )
Loi Nguyen Huynh

27

要匹配的字符长度。

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

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

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


3
这对我很有用,因为我正在寻找正则表达式来查找大于x的单词。
Zenil

3

方法1

单词边界在这里非常适用,例如:

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

正则演示1

爪哇

某些语言(例如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)

爪哇

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

正则演示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

RegEx电路

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

在此处输入图片说明


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



1

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

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

1
这与“ ^。{0,10} $”有什么不同?
Elhitch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.