Regex 在Oracle8上,有没有一种简单的方法可以转换句子中的字符串?或者我应该使用正则表达式?
我知道在Oracle中有一些字符串函数,如Regex 在Oracle8上,有没有一种简单的方法可以转换句子中的字符串?或者我应该使用正则表达式?,regex,oracle,oracle8i,Regex,Oracle,Oracle8i,我知道在Oracle中有一些字符串函数,如UPPER,LOWER,INITCAP。但我只需要大写的句子(或短语)的第一个字母,所有其他字母都是小写的,因为单词由空格或非字母数字字符分隔,句子由标点符号分隔 因此,将其转换为: PEDIDO CANCELADO,设备和投资安排。GERADA UMA NOVA REQUISIÃO SERÁGERADA UMA NOVA REQUISIÃO PARA REGULARIZAR ESTA QUESTÃO. 到 Pedido cancelado,设备和投资安
UPPER
,LOWER
,INITCAP
。但我只需要大写的句子(或短语)的第一个字母,所有其他字母都是小写的,因为单词由空格或非字母数字字符分隔,句子由标点符号分隔
因此,将其转换为:
PEDIDO CANCELADO,设备和投资安排。GERADA UMA NOVA REQUISIÃO SERÁGERADA UMA NOVA REQUISIÃO PARA REGULARIZAR ESTA QUESTÃO.
到
Pedido cancelado,设备和投资安排。Serágerada uma nova requisiço para regularizar esta questão.
仅在Oracle 10g中引入了本机函数并支持SQL和PL/SQL中的正则表达式,我用于解决plsql中问题的一个选项是创建一个函数:
create or replace function scase(s in varchar2) return varchar2 as
s_len number;
cur char(2); /*char(2) for accented character */
up boolean;
terminal char(10) := '.?!]';
r varchar2(32767);
begin
s_len := length(trim(s));
if s_len = 0 then
return r;
end if;
r := r || UPPER(substr(s, 0, 1)); /*First character of sentence*/
for i in 2 .. s_len loop
cur := substr(s, i, 1);
if up = TRUE then
if cur = ' ' then
r := r || ' ';
else
r := r || Upper(trim(cur));
up := FALSE;
end if;
else
if cur = ' ' then
r := r || ' ';
else
r := r || Lower(trim(cur));
end if;
end if;
/*I have found a bug here(Oracle 8i): instr return 7 when is ' ' (blank space) */
if instr(terminal, trim(cur)) between 1 and 6 then
up := TRUE;
end if;
end loop;
return r;
exception
when others then
raise;
end;
Connected to Oracle8i Enterprise Edition Release 8.1.7.3.0
SQL> Select toSentenceCase('PEDIDO CANCELADO, DEVIDO AO ENCERRAMENTO DE INVESTIMENTO. SERÁ GERADA UMA NOVA REQUISIÇÃO PARA REGULARIZAR ESTA QUESTÃO.')
2 from dual;
TOSENTENCECASE('PEDIDOCANCELAD
--------------------------------------------------------------------------------
Pedido cancelado, devido ao encerramento de investimento. Será gerada uma nova r
SQL>
另一个选项是在Java2中创建一个类。Oracle 8i(8.1.7)的上一个版本于2000年8月发布,支持java 2
因此,您可以用java创建代码,如下所示:
create or replace and compile java source named tosentencecase as
public class toSentenceCase
{
public static String toSentenceCase(String s) {
String r = "";
if (s.length() == 0) {
return r;
}
char c1 = s.charAt(0);
r = r + Character.toUpperCase(c1); /*First character of sentence*/
boolean up = false;
char[] terminal = {'.', '?', '!'};
for (int i = 1; i < s.length(); i++) {
char cur = s.charAt(i);
if (up) {
if (cur == ' ') {
r = r + cur;
} else {
r = r + Character.toUpperCase(cur);;
up = false;
}
} else {
r = r + Character.toLowerCase(cur);;
}
for (int j = 0; j < terminal.length; j++) {
if (cur == terminal[j]) {
up = true;
break;
}
}
}
return r;
}
}
CREATE OR REPLACE FUNCTION toSentenceCase (s IN STRING) RETURN STRING
AS LANGUAGE JAVA
NAME 'toSentenceCase.toSentenceCase (java.lang.String) return String';
然后,像普通函数一样调用:
create or replace function scase(s in varchar2) return varchar2 as
s_len number;
cur char(2); /*char(2) for accented character */
up boolean;
terminal char(10) := '.?!]';
r varchar2(32767);
begin
s_len := length(trim(s));
if s_len = 0 then
return r;
end if;
r := r || UPPER(substr(s, 0, 1)); /*First character of sentence*/
for i in 2 .. s_len loop
cur := substr(s, i, 1);
if up = TRUE then
if cur = ' ' then
r := r || ' ';
else
r := r || Upper(trim(cur));
up := FALSE;
end if;
else
if cur = ' ' then
r := r || ' ';
else
r := r || Lower(trim(cur));
end if;
end if;
/*I have found a bug here(Oracle 8i): instr return 7 when is ' ' (blank space) */
if instr(terminal, trim(cur)) between 1 and 6 then
up := TRUE;
end if;
end loop;
return r;
exception
when others then
raise;
end;
Connected to Oracle8i Enterprise Edition Release 8.1.7.3.0
SQL> Select toSentenceCase('PEDIDO CANCELADO, DEVIDO AO ENCERRAMENTO DE INVESTIMENTO. SERÁ GERADA UMA NOVA REQUISIÇÃO PARA REGULARIZAR ESTA QUESTÃO.')
2 from dual;
TOSENTENCECASE('PEDIDOCANCELAD
--------------------------------------------------------------------------------
Pedido cancelado, devido ao encerramento de investimento. Será gerada uma nova r
SQL>
PS:使用java 2(嵌入Oracle 8i中),我尝试导入java.util.regex.Matcher和import java.util.regex.Pattern,但无法编译使用regex的代码。在一个句子中,以下内容可以工作
with YOUR_TABLE AS
(
select 'THIS is a SENTENCE.' as YOUR_COLUMN from dual
)
select UPPER(SUBSTR(YOUR_COLUMN,1,1))||LOWER(SUBSTR(YOUR_COLUMN,2,LENGTH(YOUR_COLUMN))) as SENTENCE from YOUR_TABLE
SENTENCE
-------------------
This is a sentence.
类似于的答案可以帮助提供一个表格,其中包含正文中每个句子的行,这个表达式可以在该表格上运行