程序员老鬼

某大厂员工爆料,试用期被辞退0赔偿,不同意,直接就单方解除,不怕劳动仲裁吗?

刚看到个贴子,说某大厂员工吐槽:自己试用期被辞退,0赔偿,还没签任何补充协议,人一不同意,公司直接单方解除。

Image

网友吵成一片,有说“大厂就是牛,不缺你一个”的,也有一边倒劝他赶紧去劳动仲裁的。

我觉得这事吧,先撇开情绪不说,试用期≠免费试用。只要签了劳动合同,用人单位单方解除就得拿出充分理由,程序也要合规,不然就可能违法。员工这边,能做的不是网上骂几句,而是立刻把聊天记录、考核表、邮件都保留好,咨询当地仲裁委或专业人士,把流程走完。

仲裁金额也许不多,但这是在告诉公司:你不能想怎么来就怎么来。换个角度想,这也是在给后来人铺路。

面试题:产品名称格式修复

你在电商或者管理后台干过的应该懂,产品库这种东西,时间一长就变成“考古现场”了: “苹果 iPhone14pro  256g 紫色(官方标配)”, “Apple  iPhone 14 Pro 紫 256G 旗舰店同款”, 还有运营同学从别的平台粘过来的乱七八糟名字。 搜索不好用、对账不好对,做个报表还能把同一款手机拆成七八行数据,头都大。

今天就聊个很实用的小算法:怎么用 Java 写一个“产品名称格式修复器”。

别一上来就写代码,先说人话版本的规则,要不越改越乱。 以手机为例,可以先约定一个比较通用的格式:

品牌 + 空格 + 型号 + 空格 + 规格(容量) + 空格 + 颜色 + 其他属性(可选)

比如,把下面这些:

  • Apple  iphone14 PRO 256g  深紫(官方标配)
  • 苹果-iPhone14Pro 256GB 紫 5G手机【爆款】
  •  iPhone14 Pro 紫色 256G Apple 

统一修成:

Apple iPhone 14 Pro 256GB 紫色

那我们要做的其实就是几件事:

  1. 把多余空格、乱七八糟的符号先清掉;
  2. 把同一个意思的词统一一下,比如 256g / 256 G / 256GB 都当成 256GB;
  3. 把品牌、型号、容量、颜色这些信息从原字符串里“捞出来”;
  4. 按我们约定的顺序重新拼回去。

听起来有点像在“洗衣服”:先预洗、再分类、再烘干叠好。

顺带一嘴,这种“脏数据清洗”的活,在排查线上日志、同步数据库、分析埋点时也经常遇到,思路都差不多。

可以把整个修复过程当成一条小流水线:

  1. 预处理:空格、大小写、全半角统一;
  2. 规则匹配:用正则 & 关键字把各个属性“抠”出来;
  3. 组装:用统一格式把解析好的结构再拼成一个干净的名字。

用 Java 写的话,可以先定义一个小对象,专门装“解析结果”:

publicclassProductNameInfo{
private String brand;
private String model;
private String capacity;
private String color;
private String extra; // 其它描述,比如“5G手机”“官方标配”

// 省略 getter/setter/toString
}

然后写一个核心入口方法:

publicclassProductNameNormalizer{

public String normalize(String rawName){
if (rawName == null) {
return"";
        }
// 1. 预处理:空格、全角字符、大小写
        String s = preClean(rawName);

// 2. 去掉各种营销标签、括号里的促销文案
        s = removePromotionWords(s);

// 3. 解析出品牌、型号、容量、颜色等信息
        ProductNameInfo info = parseCoreAttributes(s);

// 4. 按约定格式重新拼接
return format(info);
    }
}

下面把几个关键步骤拆开说。

关键步骤一:预处理 + 噪音清理

预处理其实就是那种“见了就写”的小工具函数,但对提升效果非常关键。

private String preClean(String name){
// 去掉前后空格
    String s = name.trim();

// 把连续空格压成一个
    s = s.replaceAll("\\s+", " ");

// 全角转半角(简单点只处理常见符号)
    s = s.replace('(', '(')
         .replace(')', ')')
         .replace('【', '[')
         .replace('】', ']')
         .replace('-', '-');

// 统一单位写法:g/G/GB -> GB
    s = s.replaceAll("(?i)(\\d+)\\s*g(b)?", "$1GB");

return s;
}

private String removePromotionWords(String s){
// 去掉中括号、书名号、花括号里的营销词,如【爆款】、[热卖]、(官方标配)
    s = s.replaceAll("[\\[【《<].*?[\\]】》>]", "");
    s = s.replaceAll("\\(.*?\\)", "");

// 去掉常见无意义词
    String[] noiseWords = {"爆款", "热卖", "旗舰店同款", "正品保障"};
for (String w : noiseWords) {
        s = s.replace(w, "");
    }

// 再压一次空格
return s.replaceAll("\\s+", " ").trim();
}

上面这段算是“粗加工”,先把特别碍眼的东西都挪走。

关键步骤二:解析品牌、型号、容量、颜色

真正有点“算发味”的地方在这儿: 我们要从一整串文本里,把有用信息定位出来。

思路是:

  • 品牌:用一个品牌词典去匹配(Apple、苹果 等),命中后统一成一个标准写法;
  • 容量:正则抓类似 128GB / 256GB;
  • 颜色:用一个简单的颜色词表;
  • 型号:在去掉品牌/容量/颜色之后,剩下的主体大概率就是型号+系列。

示例代码(为了篇幅,词典写得比较简陋,你可以按业务扩展):

privatestaticfinal Map<String, String> BRAND_MAP = new HashMap<>();
privatestaticfinal Map<String, String> COLOR_MAP = new HashMap<>();
static {
    BRAND_MAP.put("apple", "Apple");
    BRAND_MAP.put("苹果", "Apple");

    COLOR_MAP.put("紫色", "紫色");
    COLOR_MAP.put("深紫", "紫色");
    COLOR_MAP.put("金色", "金色");
    COLOR_MAP.put("黑色", "黑色");
}

private ProductNameInfo parseCoreAttributes(String s){
    ProductNameInfo info = new ProductNameInfo();
    String work = s;

// 1. 品牌匹配
for (Map.Entry<String, String> e : BRAND_MAP.entrySet()) {
        String key = e.getKey();
if (work.toLowerCase().contains(key.toLowerCase())) {
            info.setBrand(e.getValue());
// 把品牌从字符串里去掉,免得后面重复
            work = work.replaceAll("(?i)" + Pattern.quote(key), "");
break;
        }
    }

// 2. 容量匹配:128GB / 256GB / 512GB
    Matcher capMatcher = Pattern.compile("(\\d{2,4})\\s*GB", Pattern.CASE_INSENSITIVE)
            .matcher(work);
if (capMatcher.find()) {
        info.setCapacity(capMatcher.group(1) + "GB");
        work = work.replace(capMatcher.group(0), "");
    }

// 3. 颜色匹配
for (Map.Entry<String, String> e : COLOR_MAP.entrySet()) {
if (work.contains(e.getKey())) {
            info.setColor(e.getValue());
            work = work.replace(e.getKey(), "");
break;
        }
    }

// 4. 剩下的当“型号 + 其它描述”
    work = work.replaceAll("\\s+", " ").trim();
    info.setModel(work); // 简化处理:全部当型号
return info;
}

这里我偷了个懒:model 就直接用剩下的整串。 实际项目里,你可以继续拆,比如把 iPhone14 Pro 拆成 系列 + 版本,那是下一层优化了。

关键步骤三:统一输出格式

最后一步就是把“洗干净、分好类”的信息重新拼接回一个规范名字:

private String format(ProductNameInfo info){
    List<String> parts = new ArrayList<>();

if (notBlank(info.getBrand())) {
        parts.add(info.getBrand());
    }
if (notBlank(info.getModel())) {
// 型号里顺手整理一下多余空格、首字母
        String model = info.getModel().trim().replaceAll("\\s+", " ");
        parts.add(model);
    }
if (notBlank(info.getCapacity())) {
        parts.add(info.getCapacity());
    }
if (notBlank(info.getColor())) {
        parts.add(info.getColor());
    }
if (notBlank(info.getExtra())) {
        parts.add(info.getExtra());
    }

return String.join(" ", parts);
}

privatebooleannotBlank(String s){
return s != null && s.trim().length() > 0;
}

这样一个“产品名称格式修复器”就跑得起来了。 你可以写个小 main 测试几条原始数据,看看输出效果:

publicstaticvoidmain(String[] args){
    ProductNameNormalizer normalizer = new ProductNameNormalizer();
    System.out.println(normalizer.normalize("苹果-iPhone14Pro 256g 紫 5G手机【爆款】"));
    System.out.println(normalizer.normalize("  iPhone14 Pro 紫色 256G Apple (官方标配) "));
}

整体思路其实很朴素:先清洗,再拆分,最后统一格式。 规则写得越细,效果会越好,但也要注意一点:别把所有逻辑全堆在一个大正则里,不好维护。 慢慢长大这套规则的时候,记得按“品牌/规格/颜色/噪音”这样分层来写函数,你以后回头看代码会感谢现在的自己。

行,先写到这,等你哪天真把这东西接到导入 Excel、SKU 比对那条链路上,再跟我吐槽一波也不迟。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领,也可以链接我微信:hls404