从位置x
到位置y
的子串的RegExp等价物是什么?
例如:
0001..STACK.OVERFLOW...IS.AWESOME.13052011
我知道这个固定长度字符串中一个名为'status'
的字段的值是从位置26开始的8个字符。在JavaScript(和Java)中的正则表达式看起来是什么样的"AWESOME"
字符串?
我正在尝试构建一个通过JMS作为固定长度字符串的大型机屏幕解析器。并且想法是编写一个UI,用户可以在其中突出显示字符串的一部分,填写“字段名称”字段,选择类型(int,String ..)并自动生成Java类。
答案 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,但即使它确实如此,坚持使用子串。