You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery中用RE2正则表达式精准去除长单词末尾句号

问题描述

需要去除句子中每个单词末尾的句号,但仅当该单词去掉末尾句号后的长度大于1时执行:

  • 将“Spain.”改为“Spain”
  • 保留“P.”不变
  • 将“U.S.A.”改为“U.S.A”
  • 将“S.S.”改为“S.S”

现有BigQuery代码对“Spain.”处理正常,但会错误地将“U.S.A.”修改为“US.A”,不符合预期,需适配各类带末尾句号的国家名或代码。

原错误代码

WITH
  t1 AS (
  SELECT
    'Spain. S.S. Spain.' sentence,
    'Spain S.S Spain' expected
  UNION ALL
  SELECT
    'U.S.A. S.S. Spain.',
    'U.S.A S.S Spain'
  UNION ALL
  SELECT
    'P. SMITH S.S. Spain.',
    'P. SMITH S.S Spain' )
SELECT
  sentence,
  REGEXP_REPLACE(sentence,r'(\w+)(\.)(.+)','\\1\\3') AS actual,
  expected
FROM
  t1;

问题分析

原正则表达式r'(\w+)(\.)(.+)'存在两处关键问题:

  1. \w仅匹配纯单词字符(不包含.),无法识别“U.S.A.”这类含点的复合词
  2. 匹配逻辑错误,会误替换复合词中间的句号,导致“U.S.A.”被破坏为“US.A”

解决方案

使用精准的正则表达式,仅替换非空白字符组成的长度≥2的序列末尾的句号(句号后为空格或字符串结尾),修改后的代码如下:

WITH
  t1 AS (
  SELECT
    'Spain. S.S. Spain.' sentence,
    'Spain S.S Spain' expected
  UNION ALL
  SELECT
    'U.S.A. S.S. Spain.',
    'U.S.A S.S Spain'
  UNION ALL
  SELECT
    'P. SMITH S.S. Spain.',
    'P. SMITH S.S Spain' )
SELECT
  sentence,
  REGEXP_REPLACE(sentence, r'(\S{2,})\.(?=\s|$)', '\\1') AS actual,
  expected
FROM
  t1;

正则规则说明

  • \S{2,}:匹配至少2个非空白字符,涵盖包含.的复合词(如“U.S.A”“S.S”)
  • \.:匹配目标末尾句号
  • (?=\s|$):正向断言,确保句号是单词的结尾(后面为空格或字符串结束)
  • 替换为\1:保留匹配的字符序列,仅去掉末尾句号

修改后所有测试用例的实际输出将与预期完全一致。

内容的提问来源于stack exchange,提问作者dpl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:25:16