首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8:带有各种分隔符的RegExp范围

Java 8:带有各种分隔符的RegExp范围
EN

Stack Overflow用户
提问于 2018-06-27 14:06:14
回答 1查看 68关注 0票数 0

我正在寻找regexp表达式来验证以下模式:

代码语言:javascript
复制
ABC

注意: ABC在这里不是一个regExp,而是用来简单地描述问题。

代码语言:javascript
复制
Block | Accepted values              |
------+------------------------------+
A     | Any number between 1 and 11  |
B     | , or - or |                  |
C     | Any number between 1 and 11  |

注释

  1. ,:枚举一些确切的值
  2. -:表示范围
  3. |:一个值还是另一个值
  4. 这些符号可以混合(例如2,3 | 1-9 | 10-11)

示例

有效表达式

代码语言:javascript
复制
1
9,10
9,10,11|1-5
1-11
8|10
1|3|7
etc..

无效表达式

代码语言:javascript
复制
0
20
9,10,15
1-19
1|12
1|11,
etc..

尝试过

代码语言:javascript
复制
public class RuleTest {

    String A = "[1-9]|1[0-1]";
    String B = "[\\,\\-\\|]";
    String C = "[1-9]|1[0-1]";

    Pattern RULE_DROP_DIGIT = Pattern.compile(A+"|"+A+B+C);

    @Test
    public void mustPassRuledropdigitPatternTest() {
        assertTrue(RULE_DROP_DIGIT.matcher("1").matches());
        assertTrue(RULE_DROP_DIGIT.matcher("1-9").matches());
        assertTrue(RULE_DROP_DIGIT.matcher("10-11").matches());
        assertTrue(RULE_DROP_DIGIT.matcher("1|9").matches());
        assertTrue(RULE_DROP_DIGIT.matcher("10|11").matches());
        assertTrue(RULE_DROP_DIGIT.matcher("1,9").matches());
        assertTrue(RULE_DROP_DIGIT.matcher("10,11").matches());
        assertTrue(RULE_DROP_DIGIT.matcher("9,10,11|1-5").matches());
        assertTrue(RULE_DROP_DIGIT.matcher("3|5|7").matches());
    }

    @Test
    public void mustFailRuledropdigitPatternTest() {
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, ""));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "  "));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "0"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "14"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1--9"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1--19"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "10--11"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1||9"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1||19"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "10||11"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1,,9"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "1,,19"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "10,,11"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "0,1"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "12"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, "8,"));
        assertTrue(catchedAssertionError(RULE_DROP_DIGIT, ",8"));
    }

    /*
     * Catch AssertionError
     */
    private boolean catchedAssertionError(Pattern code, CharSequence input) {
        try {
            assertTrue(code.matcher(input).matches());
            return false;
        } catch (AssertionError e) {
            // NOTHING
        }
        return true;
    }
}

问题

  1. 我的正则表达式怎么了?
  2. 什么才是正确的呢?

EDIT1:更正A,B EDIT2:添加注释

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-27 14:13:59

您将无法使用正则表达式检查范围的左侧小于或等于右侧。

尽管如此:

代码语言:javascript
复制
^(?:0*(?:1[01]|[1-9]))(?:[,\-|]0*(?:1[01]|[1-9]))*$

从…

代码语言:javascript
复制
String A = "(?:0*(?:1[01]|[1-9]))";
String B = "[,\\-|]";

Pattern.compile("^" + A + "(?:" + B + A + ")*$");

推导:

A_

代码语言:javascript
复制
0*(?:1[01]|[1-9])

B-或-或

代码语言:javascript
复制
[,\-|]

C\x{e76f}1至11之间的任何数字

代码语言:javascript
复制
0*(?:1[01]|[1-9])

在您的原始代码中:

字符串A=“1-9\1-910-1”;

第二个[1-9]将导致这与10或11不匹配,但将匹配110到911之间的许多数字。

另外,当没有显式匹配^...$ (例如使用.find()而不是.matches())时,首先拥有[1-9]将导致它只匹配11中的第二个'1'

模式RULE_DROP_DIGIT =Pattern.compile(A+“AC.26”+A+B+C);

ABC没有括号,因此"|"A中的|处于同一级别。

解决这一问题的一种方法是添加括号。

代码语言:javascript
复制
Pattern RULE_DROP_DIGIT = Pattern.compile("(?:"+A+")|(?:"+A+B+C+")");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51064914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档