RegEx Or和AND

时间:2018-03-13 23:29:10

标签: php regex

您好我厌倦了在PHP中使用RegEx。以下是我喜欢的内容:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author Jack <J@ck>
 * https://stackoverflow.com/questions/49266832/integer-in-compareto
 */
public class ListReverse {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4);

        // Creates new list wit reverse order
        List<Integer> reverseList = list.stream()
                .sorted(Comparator.reverseOrder())
                .collect(Collectors.toList());
        System.out.println(reverseList);
    }
}

问题是我只得到

<a="300">
<a="300"b="300">
<b="300">

使用以下RegEx:

<a="300">
<b="300">

我需要改变什么,我得到所有三个元素?有ANDOR运算符吗?

3 个答案:

答案 0 :(得分:1)

假设你的问题是一个简单的字符串处理而不是严肃的解析,我会像这样修改你的正则表达式:

<(a|b)="[0-9]+".*>

我添加了.*以允许">之间的字符。

或稍微有点味道的版本:

<[ab]="\d+"[^>]*?>
  • 使用|管道单个字符比[...]
  • 更不受欢迎
  • \d用于数字系列
  • [^>]*?代表>
  • 以外的字符

答案 1 :(得分:0)

您需要一个额外的分组来指定您接受多种类型的分组:

echo '<a="300">
<a="300"b="300">
<b="300">' | egrep '<((a|b)="[0-9]*")+>'
<a="300">
<a="300"b="300">
<b="300">

答案 2 :(得分:0)

正则表达式不是布尔逻辑。正则表达式中的|符号不是OR运算符;它被称为交替,它的工作方式相似,但并不完全相同。如果您只是尝试匹配多个字符中的一个,则应使用方括号[]来创建字符集。在这种情况下,[ab]匹配ab,就像[0-9]匹配012等一样。< / p>

这是我建议的模式

<[ab]="\d+"(?:[ab]="\d+")?>