<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tom7668h</title>
    <description>The latest articles on DEV Community by Tom7668h (@tom7668h).</description>
    <link>https://dev.to/tom7668h</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4205381%2F88240e34-dd95-4cd7-9a8f-610071bf0ae3.png</url>
      <title>DEV Community: Tom7668h</title>
      <link>https://dev.to/tom7668h</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tom7668h"/>
    <language>en</language>
    <item>
      <title>Why matching commercial vehicle OEM part numbers in SQL is messy (and how we open-sourced our parser)</title>
      <dc:creator>Tom7668h</dc:creator>
      <pubDate>Sat, 24 Oct 2026 21:06:55 +0000</pubDate>
      <link>https://dev.to/tom7668h/why-matching-commercial-vehicle-oem-part-numbers-in-sql-is-messy-and-how-we-open-sourced-our-2dkp</link>
      <guid>https://dev.to/tom7668h/why-matching-commercial-vehicle-oem-part-numbers-in-sql-is-messy-and-how-we-open-sourced-our-2dkp</guid>
      <description>&lt;p&gt;When building an automotive or commercial vehicle price comparison engine, the biggest data bottleneck isn't scraping or API rate limits—it's &lt;strong&gt;inconsistent OEM and OES part numbers&lt;/strong&gt; across different supplier feeds.&lt;/p&gt;

&lt;p&gt;While building the catalog pipeline for &lt;strong&gt;&lt;a href="https://www.crazypartsnatcher.com" rel="noopener noreferrer"&gt;CrazyPartSnatcher&lt;/a&gt;&lt;/strong&gt; (a real-time price comparison platform for commercial vehicle, truck, and trailer spare parts), we constantly ran into the same matching issue across our database tables.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem: 1 Part, 5 Different String Formats
&lt;/h3&gt;

&lt;p&gt;A single truck brake pad, sensor, or filter from manufacturers like &lt;strong&gt;MAN, Mercedes-Benz Trucks, DAF, Bosch, Hella, Febi Bilstein, or DT Spare Parts&lt;/strong&gt; shows up differently in almost every CSV feed and marketplace listing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supplier A: &lt;code&gt;81.50110-0144&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Supplier B: &lt;code&gt;81 50110 0144&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Marketplace listing: &lt;code&gt;81501100144&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Mercedes OEM format: &lt;code&gt;A 000 420 00 20&lt;/code&gt; vs &lt;code&gt;A0004200020&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Bosch 10-digit format: &lt;code&gt;0 986 479 R66&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a workshop mechanic searches for &lt;code&gt;81.50110.0144&lt;/code&gt; and your SQL query only checks the raw string—or strips characters inconsistently—you miss valid supplier offers.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution: &lt;code&gt;@crazypartsnatcher/oem-normalizer&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of keeping this regex and formatting logic locked inside our private backend, we extracted it into a lightweight, &lt;strong&gt;zero-dependency TypeScript/JavaScript package&lt;/strong&gt; and published it on npm and GitHub.&lt;/p&gt;

&lt;p&gt;It handles four core tasks out of the box:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;normalizeOem(input)&lt;/code&gt;&lt;/strong&gt;: Strips formatting noise (dots, dashes, spaces, slashes) into a strict uppercase indexable string for fast SQL/MariaDB lookups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;generateSearchVariants(input)&lt;/code&gt;&lt;/strong&gt;: Generates common vendor-specific spacing and punctuation variants for fuzzy search queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;detectManufacturerFormat(input)&lt;/code&gt;&lt;/strong&gt;: Identifies probable OEM/Aftermarket numbering schemas (e.g., Bosch 10-digit, Mercedes A-numbers, MAN formats).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;buildPartSearchUrl(oemNumber)&lt;/code&gt;&lt;/strong&gt;: Builds direct lookup URLs for live price checks.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Quick Usage Example
&lt;/h3&gt;

&lt;p&gt;Install via npm:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @crazypartsnatcher/oem-normalizer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Use it in your Node.js / TypeScript pipeline or frontend search:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { 
  normalizeOem, 
  generateSearchVariants, 
  detectManufacturerFormat,
  buildPartSearchUrl 
} from '@crazypartsnatcher/oem-normalizer';

const rawInput = '81.50110-0144';
const cleanKey = normalizeOem(rawInput); // "81501100144"
const variants = generateSearchVariants(rawInput);
const formats = detectManufacturerFormat(rawInput);
const comparisonUrl = buildPartSearchUrl(cleanKey);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Live Interactive Playground &amp;amp; Source Code
&lt;/h3&gt;

&lt;p&gt;We also built a browser-based interactive tester on GitHub Pages where you can paste truck and trailer OEM numbers to test the normalizer and jump straight to live aftermarket price comparisons for brands like &lt;strong&gt;Bosch, Hella, Brembo, ATE, Mahle, and Febi Bilstein&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Production Search:&lt;/strong&gt; &lt;a href="https://www.crazypartsnatcher.com" rel="noopener noreferrer"&gt;CrazyPartSnatcher – Nutzfahrzeug &amp;amp; Lkw-Ersatzteile Preisvergleich&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive OEM Tester (GitHub Pages):&lt;/strong&gt; &lt;a href="https://tom7668h.github.io/oem-part-normalizer/" rel="noopener noreferrer"&gt;OEM Part Normalizer Docs &amp;amp; Playground&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm Package:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@crazypartsnatcher/oem-normalizer" rel="noopener noreferrer"&gt;@crazypartsnatcher/oem-normalizer on npm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/Tom7668h/oem-part-normalizer" rel="noopener noreferrer"&gt;Tom7668h/oem-part-normalizer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are working with TecDoc data, automotive catalogs, or supplier feeds, feel free to fork the repo or open a PR with additional manufacturer regex patterns!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Tom7668h" rel="noopener noreferrer"&gt;
        Tom7668h
      &lt;/a&gt; / &lt;a href="https://github.com/Tom7668h/oem-part-normalizer" rel="noopener noreferrer"&gt;
        oem-part-normalizer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Zero-dependency TypeScript/JS library to normalize, parse, and cross-reference commercial vehicle &amp;amp; truck OEM part numbers (MAN, Mercedes-Benz, DAF, Bosch, Hella, Febi). Official core utility powering the CrazyPartSnatcher Nutzfahrzeug &amp;amp; Lkw-Ersatzteile price comparison engine.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;@crazypartsnatcher/oem-normalizer&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@crazypartsnatcher/oem-normalizer" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1405a3e080fb09acba123f88bedfbecbbf5e54c80bf31c0673dba260c2192a43/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406372617a7970617274736e6174636865722f6f656d2d6e6f726d616c697a65722e7376673f7374796c653d666c61742d73717561726526636f6c6f723d626c7565" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1b01ef0024ba0866c115986b895301f657c1b21fc29f05c4844b7f2e8d89204d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e7376673f7374796c653d666c61742d737175617265" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://www.typescriptlang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b5c7dabd3e86090aac4c580a412b6bf011f8b017f2b6a4f9450595e92fa53a35/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d5374726963742d626c75652e7376673f7374796c653d666c61742d737175617265" alt="TypeScript Ready"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Tom7668h/oem-part-normalizer#" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d4e89f527be1ae305d70a5b4ad1d0444ed51fe93e9b9168e830ed806a65a4e01/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646570656e64656e636965732d302d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265" alt="Zero Dependencies"&gt;&lt;/a&gt;
&lt;a href="https://www.crazypartsnatcher.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/115d51c2029a0a59df797934dfa6c761eb79cba1213a34e8aacf56d8e0d91981/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506f776572656425323062792d4372617a7950617274536e6174636865722d6f72616e67652e7376673f7374796c653d666c61742d737175617265" alt="Powered by CrazyPartSnatcher"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A lightweight, zero-dependency TypeScript utility library for normalizing, formatting, validating, and generating search variants of automotive and commercial vehicle OEM, OES, and aftermarket part numbers.&lt;/p&gt;
&lt;p&gt;This open-source engine serves as the core part number normalizer behind &lt;a href="https://www.crazypartsnatcher.com" rel="nofollow noopener noreferrer"&gt;CrazyPartSnatcher – Preisvergleich für Nutzfahrzeug- &amp;amp; Lkw-Ersatzteile&lt;/a&gt;, helping workshops, fleet operators, and automotive developers bridge formatting discrepancies across catalogs, ERP inventories, and multi-supplier databases.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Problem: The Automotive Part Number Chaos&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;In automotive and commercial vehicle parts data, the identical physical replacement component is represented across ERP systems, TecDoc catalogs, supplier CSV feeds, and workshop management software in dozens of incompatible formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MAN Truck &amp;amp; Bus&lt;/strong&gt;: &lt;code&gt;81.50110.0144&lt;/code&gt; vs. &lt;code&gt;81501100144&lt;/code&gt; vs. &lt;code&gt;81.50110-0144&lt;/code&gt; vs. &lt;code&gt;81 50110 0144&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mercedes-Benz / Daimler Truck&lt;/strong&gt;: &lt;code&gt;A 000 420 00 20&lt;/code&gt; vs. &lt;code&gt;A0004200020&lt;/code&gt; vs. &lt;code&gt;0004200020&lt;/code&gt; vs. &lt;code&gt;000 420 00 20&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bosch&lt;/strong&gt;: &lt;code&gt;0 281 002 461&lt;/code&gt; vs. &lt;code&gt;0281002461&lt;/code&gt; vs. &lt;code&gt;0-281-002-461&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DT Spare Parts&lt;/strong&gt;: &lt;code&gt;4.61234&lt;/code&gt; vs. &lt;code&gt;461234&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Tom7668h/oem-part-normalizer" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>typescript</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
