Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Oracle8上,有没有一种简单的方法可以转换句子中的字符串?或者我应该使用正则表达式?_Regex_Oracle_Oracle8i - Fatal编程技术网

Regex 在Oracle8上,有没有一种简单的方法可以转换句子中的字符串?或者我应该使用正则表达式?

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,设备和投资安

我知道在Oracle中有一些字符串函数,如
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.
类似于的答案可以帮助提供一个表格,其中包含正文中每个句子的行,这个表达式可以在该表格上运行