正则表达式相当于str.getSubstring(x,y);

时间:2011-05-13 00:38:16

标签: java javascript regex parsing

从位置x到位置y的子串的RegExp等价物是什么?

例如:

0001..STACK.OVERFLOW...IS.AWESOME.13052011

我知道这个固定长度字符串中一个名为'status'的字段的值是从位置26开始的8个字符。在JavaScript(和Java)中的正则表达式看起来是什么样的"AWESOME"字符串?

我正在尝试构建一个通过JMS作为固定长度字符串的大型机屏幕解析器。并且想法是编写一个UI,用户可以在其中突出显示字符串的一部分,填写“字段名称”字段,选择类型(int,String ..)并自动生成Java类。

4 个答案:

答案 0 :(得分:4)

.{26}(.{8})

第一个。{26}吃掉前26个字符,无论它们是什么。 (。{8})捕获接下来的8个字符并存储它们。对于Javascript,您可以使用

var matches= /.{26}(.{8})/.exec("0001..STACK.OVERFLOW...IS.AWESOME.13052011")

和匹配[1]将是您正在寻找的substr。 (匹配[0]始终包含整个匹配的字符串)

请注意,如果需要,.s可以替换为字符类(例如[\ w] {26} [\ w] {8})

答案 1 :(得分:1)

在Java中,Pattern.compile("(?s)(?<=.{26}).{8}")应该这样做,子字符串是匹配的文本。

您无法在javascript中执行此操作,因为JavaScript正则表达式不支持lookbehind,但您可以执行捕获组。 在JavaScript中,您最接近的是/^[\s\S]{26}([\s\S]{8})/,子字符串在组1中。

请注意,这会计算字符数,而不是代码点数,因此可能会拆分代理项对,但JavaScript和Java内置的substring函数会遇到同样的问题。

答案 2 :(得分:0)

我认为这应该有效:

^(?<=.{28}).{8}

这将在JavaScript中工作,因为JavaScript不支持后视。

编辑(关于换行):如果您希望.匹配新行,则必须在Java中指定Pattern.DOTALL。有关更多详细信息,请查看JavaDocs中的Pattern,尤其是Pattern.compile(String regex, int flags)

您也可以在正则表达式中添加(?s)来启用此功能。

另一个想法:如果你不想严格获得28个字符的子字符串,你想得到一个跟随其他模式的字符串(比如“STATUS”之后的8个字符),你可以这样做:

^(?s)(?<=STATUS).{8}

答案 3 :(得分:0)

^(?<=.{2}).*(?=.{3})$这样的东西会让你在2之前和之前结束3位置时开始子串。是的,这不适用于JS,但即使它确实如此,坚持使用子串。