Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
77d5024d
提交
77d5024d
authored
6 年前
作者:
Evgenij Ryazanov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Extract Function.regexpReplace() with some minor changes
上级
05710fc2
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
39 行增加
和
44 行删除
+39
-44
Function.java
h2/src/main/org/h2/expression/Function.java
+39
-44
没有找到文件。
h2/src/main/org/h2/expression/Function.java
浏览文件 @
77d5024d
...
...
@@ -17,6 +17,7 @@ import java.sql.ResultSet;
import
java.sql.SQLException
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
java.util.regex.PatternSyntaxException
;
...
...
@@ -1350,50 +1351,11 @@ public class Function extends Expression implements FunctionCall {
break
;
}
case
REGEXP_REPLACE:
{
String
input
=
v0
.
getString
();
String
regexp
=
v1
.
getString
();
String
replacement
=
v2
.
getString
();
if
(
database
.
getMode
().
regexpReplaceBackslashReferences
)
{
if
((
replacement
.
indexOf
(
'\\'
)
>=
0
)
||
(
replacement
.
indexOf
(
'$'
)
>=
0
))
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
replacement
.
length
();
i
++)
{
char
c
=
replacement
.
charAt
(
i
);
if
(
c
==
'$'
)
{
sb
.
append
(
'\\'
);
}
else
if
(
c
==
'\\'
&&
++
i
<
replacement
.
length
())
{
c
=
replacement
.
charAt
(
i
);
sb
.
append
(
c
>=
'0'
&&
c
<=
'9'
?
'$'
:
'\\'
);
}
sb
.
append
(
c
);
}
replacement
=
sb
.
toString
();
}
}
String
regexpMode
=
v3
==
null
||
v3
.
getString
()
==
null
?
""
:
v3
.
getString
();
boolean
isInPostgreSqlMode
=
Mode
.
ModeEnum
.
PostgreSQL
.
equals
(
database
.
getMode
().
getEnum
());
int
flags
=
makeRegexpFlags
(
regexpMode
,
isInPostgreSqlMode
);
try
{
if
(
isInPostgreSqlMode
&&
!
regexpMode
.
contains
(
"g"
))
{
result
=
ValueString
.
get
(
Pattern
.
compile
(
regexp
,
flags
).
matcher
(
v0
.
getString
())
.
replaceFirst
(
replacement
),
database
.
getMode
().
treatEmptyStringsAsNull
);
}
else
{
result
=
ValueString
.
get
(
Pattern
.
compile
(
regexp
,
flags
).
matcher
(
v0
.
getString
())
.
replaceAll
(
replacement
),
database
.
getMode
().
treatEmptyStringsAsNull
);
}
}
catch
(
StringIndexOutOfBoundsException
e
)
{
throw
DbException
.
get
(
ErrorCode
.
LIKE_ESCAPE_ERROR_1
,
e
,
replacement
);
}
catch
(
PatternSyntaxException
e
)
{
throw
DbException
.
get
(
ErrorCode
.
LIKE_ESCAPE_ERROR_1
,
e
,
regexp
);
}
catch
(
IllegalArgumentException
e
)
{
throw
DbException
.
get
(
ErrorCode
.
LIKE_ESCAPE_ERROR_1
,
e
,
replacement
);
}
String
regexpMode
=
v3
!=
null
?
v3
.
getString
()
:
null
;
result
=
regexpReplace
(
input
,
regexp
,
replacement
,
regexpMode
);
break
;
}
case
RPAD:
...
...
@@ -1656,8 +1618,7 @@ public class Function extends Expression implements FunctionCall {
break
;
case
REGEXP_LIKE:
{
String
regexp
=
v1
.
getString
();
String
regexpMode
=
v2
==
null
||
v2
.
getString
()
==
null
?
""
:
v2
.
getString
();
String
regexpMode
=
v2
!=
null
?
v2
.
getString
()
:
null
;
int
flags
=
makeRegexpFlags
(
regexpMode
,
false
);
try
{
result
=
ValueBoolean
.
get
(
Pattern
.
compile
(
regexp
,
flags
)
...
...
@@ -2040,6 +2001,40 @@ public class Function extends Expression implements FunctionCall {
return
md
;
}
private
Value
regexpReplace
(
String
input
,
String
regexp
,
String
replacement
,
String
regexpMode
)
{
Mode
mode
=
database
.
getMode
();
if
(
mode
.
regexpReplaceBackslashReferences
)
{
if
((
replacement
.
indexOf
(
'\\'
)
>=
0
)
||
(
replacement
.
indexOf
(
'$'
)
>=
0
))
{
StringBuilder
sb
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
replacement
.
length
();
i
++)
{
char
c
=
replacement
.
charAt
(
i
);
if
(
c
==
'$'
)
{
sb
.
append
(
'\\'
);
}
else
if
(
c
==
'\\'
&&
++
i
<
replacement
.
length
())
{
c
=
replacement
.
charAt
(
i
);
sb
.
append
(
c
>=
'0'
&&
c
<=
'9'
?
'$'
:
'\\'
);
}
sb
.
append
(
c
);
}
replacement
=
sb
.
toString
();
}
}
boolean
isInPostgreSqlMode
=
Mode
.
ModeEnum
.
PostgreSQL
.
equals
(
mode
.
getEnum
());
int
flags
=
makeRegexpFlags
(
regexpMode
,
isInPostgreSqlMode
);
try
{
Matcher
matcher
=
Pattern
.
compile
(
regexp
,
flags
).
matcher
(
input
);
return
ValueString
.
get
(
isInPostgreSqlMode
&&
(
regexpMode
==
null
||
regexpMode
.
indexOf
(
'g'
)
<
0
)
?
matcher
.
replaceFirst
(
replacement
)
:
matcher
.
replaceAll
(
replacement
),
mode
.
treatEmptyStringsAsNull
);
}
catch
(
StringIndexOutOfBoundsException
e
)
{
throw
DbException
.
get
(
ErrorCode
.
LIKE_ESCAPE_ERROR_1
,
e
,
replacement
);
}
catch
(
PatternSyntaxException
e
)
{
throw
DbException
.
get
(
ErrorCode
.
LIKE_ESCAPE_ERROR_1
,
e
,
regexp
);
}
catch
(
IllegalArgumentException
e
)
{
throw
DbException
.
get
(
ErrorCode
.
LIKE_ESCAPE_ERROR_1
,
e
,
replacement
);
}
}
private
static
int
makeRegexpFlags
(
String
stringFlags
,
boolean
ignoreGlobalFlag
)
{
int
flags
=
Pattern
.
UNICODE_CASE
;
if
(
stringFlags
!=
null
)
{
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论