正则表达式用于捕获第n个字符

时间:2019-04-27 01:25:43

标签: regex regex-group

我想用如下字符串捕获第三个逗号:

public class RGBtoHSV {
  float r;
  float g;
  float b;
  public RGBtoHSV(int red, int green, int blue) {
    //Scale to float from 8 bit RGB values
    r = red/255;
    g = green/255;
    b = blue/255;
  }
  public int[] getHSV() {
    float cmax = Math.max(r, Math.max(g, b));
    float cmin = Math.min(r, Math.min(g, b));
    float deltaC = cmax - cmin;
    float h;
    if (cmax==r) {
        h = (((g-b)/deltaC)%6)*60;
    } else if (cmax==g) {
        h = (((b-r)/deltaC) + 2)*60;
    } else {
      h = (((r-g)/deltaC) + 4)*60;
    }
    float s = 0;
    if (cmax!=0) {
      s = deltaC/cmax;
    }
    int[] returnValue = new int[3];
    // re-scale
    returnValue[0] = (int) h/255;
    returnValue[1] = (int) s/255;
    returnValue[2] = (int) cmax/255;
    return returnValue;
}

除以下内容外,我想到了类似人物的角色

98,52,"110,18479456000019"

但是,结果是捕获了所有逗号。

在那之后,我尝试了一些关于nth捕获的正则表达式-似乎是一种解决方案-但没有任何效果。

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

有几种捕获第三个 的方法。 This RegEx是这样做的一种方式:

([\d,])\x22\d+(,)\d+\x22

您想要的 在第二组(,)中,只是为了简单起见,您可以使用 $ 2 进行调用。

为了安全起见,我为此RegEx添加了其他边界,您可以将其删除:

enter image description here

\x22只是,如果需要,您可以替换它:

([\d,])"\d+(,)\d+"

在必要时,您还可以使用( \ )并转义一个字符。


如果您的输入要复杂一些,也许是这样的:

enter image description here

您可以在第三个之前创建一个中间边界,并在中间边界([\d\w\"]+)中添加所有可能的字符,例如this RegEx

 (\d+,){2}[\d\w\"]+(,)

并使用 $ 2 捕获第三个 。这次,您还可以从右侧放松表情,并且仍然可以使用。

您还可以在正则表达式中添加开始 ^

^(\d+,){2}[\d\w\"]+(,)

作为附加的左边界,这意味着您的输入必须以该表达式开头。