Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 要匹配简单降价的regexp_Java_Regex - Fatal编程技术网

Java 要匹配简单降价的regexp

Java 要匹配简单降价的regexp,java,regex,Java,Regex,我试图找出regexp来匹配所有出现的*这类字符串*。不幸的是,另外两条规则使事情比我想象的更复杂: 带标记的字符串应以*开头,后跟非空白字符(因此*这一个*不应匹配) 带标记的字符串应以非空格结尾,后跟*和空格(因此*这一个*和*这一个不应匹配) 我从最简单的regexp\*\S([^\*]+)?\*开始,它用于我的测试字符串: *foo 1*2 bar*foo*b*azz*qu**ux* 匹配方括号中的位置: [*foo 1*]2 bar*foo[*b*]azz[*qu*][*ux*] 这就

我试图找出regexp来匹配所有出现的
*这类字符串*
。不幸的是,另外两条规则使事情比我想象的更复杂:

  • 带标记的字符串应以
    *
    开头,后跟非空白字符(因此
    *这一个*
    不应匹配)
  • 带标记的字符串应以非空格结尾,后跟
    *
    和空格(因此
    *这一个*
    *这一个
    不应匹配)
  • 我从最简单的regexp
    \*\S([^\*]+)?\*
    开始,它用于我的测试字符串:

    *foo 1*2 bar*foo*b*azz*qu**ux*

    匹配方括号中的位置:

    [*foo 1*]2 bar*foo[*b*]azz[*qu*][*ux*]

    这就是我想要实现的目标:

    [*foo 1*2 bar*]foo[*b*]azz[*qu**ux*]

    因此出现了两个问题:

    • 如何在regexp中表示2中的规则。“搜索到第一个非空格后跟
      *
      后跟空格出现”?正向前瞻
    • 如何匹配规则2中的空白,但不将其包含到结果中,哪个
      \*\S([^\*]+)?\*\S
      可以

    如果要从最右边的
    *
    开始匹配,可以使用

    \*(?=[^\s*]).*?(?<=[^\s*])\*(?!\S)
    
    请参阅开始处的and.Add
    (?s)
    ,或使用
    模式.DOTALL进行编译,以跨行匹配文本

    详细信息

    • \*
      -a
      *
      字符
    • (?=[^\s*])
      -下一个字符必须是非空白字符,而不是
      *
    • *?
      -任何0+字符尽可能少

    • (?我使用了完全匹配,而不是组,它完美地匹配了您的测试字符串:

      "(?<=\\s|^)\\*(?:\\S|\\S.*?\\S)\\*(?=\\s)"
      
      (?
      公共类测试{
      公共静态void main(字符串[]args){
      Pattern=Pattern.compile(“\\*\\S.*”(?您可以使用正则表达式:

      \*(?!\s)(*?)?
      如何在regexp中表示2中的规则。“搜索到第一个非空格后跟*后跟空格出现”?正向前瞻

      只有在最后一个星号前面有非空白字符时,才可以使用负前视来匹配星号;在后面有空白字符或字符串结尾时,可以使用正前视来匹配星号

      如何匹配规则2中的空白,但不将其包含在结果中,哪一个*\S([^*]+)?*\S可以


      如果您想检查
      模式
      后面是否有字符而不使用它,您可以使用先行检查,例如
      模式(?=\s)
      不会使用
      \s
      而不是
      模式

      请澄清像
      *1**2*
      **1*
      [*1**2*]
      因为
      2*
      是字符串中遵循“非空格后跟
      *
      后跟空格”规则的第一个结束符。与第二个示例相同:
      [**1*]
      那么您想完全匹配这两种情况吗?是的,这些情况应该完全匹配。对于
      ****foo 1*2条*
      ?整个字符串还是
      *foo 1*2条*
      String regex = "\\*(?=[^\\s*]).*?(?<=[^\\s*])\\*(?!\\S)";
      
      "(?<=\\s|^)\\*(?:\\S|\\S.*?\\S)\\*(?=\\s)"
      
      public class Test {
      
          public static void main(String[] args) {
              Pattern pattern = Pattern.compile("\\*\\S.*?(?<!\\s)\\*(?=\\s|$)");
              Matcher matcher = pattern.matcher("*foo 1 * 2 bar* foo *b* azz *qu **ux*");
              int i = 1;
              while(matcher.find()) {
                  System.out.printf("%d: %s%n", i++, matcher.group());
              }
          }
      }
      
      \*(?!\s)(.*?)(?<!\s|\*)\*(?=\s|$)