菜譜大全——字符串處理藝術:從文本解析到高效搜索 [特殊字符][特殊字符]

目錄

  • 前言
  • 一、現實場景
  • 二、技術映射
    • 2.1 基礎刀工:String類
    • 2.2 高效剁餡:StringBuilder
    • 2.3 精準雕刻:正則表達式
  • 三、知識點呈現
    • 3.1 String vs StringBuilder vs StringBuffer
    • 3.2 正則表達式核心語法速查
    • 3.3 字符串拼接性能陷阱
  • 四、代碼實現
  • 五、延展思考
  • 總結

前言

當烹飪遇見代碼

各位開發者朋友,不知道你們有沒有這樣的經歷——看著媽媽手寫的菜譜筆記,想著要是能把它數字化該多好?或者開發一個菜譜App時,面對用戶上傳的各種格式的菜譜文本頭疼不已?今天,我們就來聊聊如何用Java的字符串處理技術,像切菜一樣利落地處理這些文本數據!

字符串處理是Java編程中最基礎卻最重要的技能之一,就像廚師刀工一樣,好的字符串處理能讓程序運行得更"美味"。我們將從最基礎的String類開始,逐步深入到StringBuilder、正則表達式,最后還會揭秘大眾點評等平臺如何優化菜譜搜索算法。準備好了嗎?讓我們系上圍裙,開始這場"烹飪"之旅吧!

🌟 關于我 | 李工👨?💻
深耕代碼世界的工程師 | 用技術解構復雜問題 | 開發+教學雙重角色
🚀 為什么訪問我的個人知識庫?
👉 https://cclee.flowus.cn/
? 更快的更新 - 搶先獲取未公開的技術實戰筆記
? 沉浸式閱讀 - 自適應模式/代碼片段一鍵復制
? 擴展資源庫 - 附贈 「編程資源」 + 「各種工具包」
🌌 這里不僅是博客 → 更是我的 編程人生全景圖🌐
從算法到架構,從開源貢獻到技術哲學,歡迎探索我的立體知識庫!

一、現實場景

🧑?🍳 混亂的菜譜文本

假設我們收到了用戶提交的這樣一份"西紅柿炒蛋"菜譜文本:

"西紅柿炒蛋 材料:西紅柿2個,雞蛋3個 步驟:1.西紅柿切塊 2.雞蛋打散 3.熱油下鍋炒雞蛋 4.加入西紅柿翻炒 5.加鹽調味"

作為一名"代碼廚師",我們需要從中提取出:

  1. 菜名

  2. 材料列表(包括材料和用量)

  3. 步驟列表

看起來簡單?但實際用戶輸入可能是千奇百怪的:

  • 有人用"番茄"而不是"西紅柿"

  • 用量單位可能是"個"、“克”、"ml"等

  • 步驟編號可能是"1."、“1)”、"第一步"等形式

String recipe = "西紅柿炒蛋 材料:西紅柿2個,雞蛋3個 步驟:1.西紅柿切塊 2.雞蛋打散...";
// 我們需要從這里提取結構化數據

面對這樣的需求,普通的字符串處理方法很快就會變得力不從心。這就是為什么我們需要系統學習Java的字符串處理技術,從基礎到高級逐步掌握。

二、技術映射

📜 String家族的"廚具"展示

2.1 基礎刀工:String類

String就像一把水果刀——簡單但用途廣泛。它是不可變(immutable)的,任何修改操作都會產生新對象。

// 提取菜名 - 使用substring
String recipe = "西紅柿炒蛋 材料:...";
String dishName = recipe.substring(0, recipe.indexOf(" "));
System.out.println("菜名:" + dishName); // 輸出:菜名:西紅柿炒蛋// 替換文本 - 將"西紅柿"替換為"番茄"
String newRecipe = recipe.replace("西紅柿", "番茄");

?? 小知識:String的不可變性就像切好的菜不能變回完整蔬菜,每次"修改"其實是在準備新食材。

2.2 高效剁餡:StringBuilder

當需要頻繁修改字符串時(比如拼接多個菜譜步驟),StringBuilder就像廚師的多功能料理機,效率極高。

// 拼接多個步驟
StringBuilder stepsBuilder = new StringBuilder();
stepsBuilder.append("1.西紅柿切塊").append("\n").append("2.雞蛋打散").append("\n").append("3.熱油下鍋");
String allSteps = stepsBuilder.toString();

🆚 性能對比:測試顯示,拼接10萬次字符串時,String耗時約32秒,而StringBuilder僅需2毫秒!

2.3 精準雕刻:正則表達式

正則表達式就像一套專業的雕刻工具,可以完成復雜的文本模式匹配。

// 提取所有材料和用量
String materials = "材料:西紅柿2個,雞蛋3個,鹽5克";
Pattern pattern = Pattern.compile("([\u4e00-\u9fa5]+)(\\d+)([個克ml]+)");
Matcher matcher = pattern.matcher(materials);
while (matcher.find()) {System.out.println("材料:" + matcher.group(1) + ", 用量:" + matcher.group(2) + matcher.group(3));
}

💡 專業技巧[\u4e00-\u9fa5]匹配所有中文字符,\\d+匹配數字。

三、知識點呈現

🔥 掌握"火候"是關鍵

3.1 String vs StringBuilder vs StringBuffer

特性StringStringBuilderStringBuffer
可變性不可變可變可變
線程安全是(天然)是(synchronized)
性能最低最高(單線程)中等
使用場景靜態內容單線程頻繁修改多線程環境

3.2 正則表達式核心語法速查

  • \d:數字

  • \w:單詞字符(字母數字下劃線)

  • \s:空白字符

  • [abc]:a、b或c

  • [^abc]:非a、b、c

  • *:0次或多次

  • +:1次或多次

  • ?:0次或1次

  • {n}:恰好n次

  • {n,}:至少n次

  • {n,m}:n到m次

3.3 字符串拼接性能陷阱

// 錯誤示范 - 每次循環都創建新StringBuilder
String result = "";
for (int i = 0; i < 10000; i++) {result += i; // 等價于 new StringBuilder().append(result).append(i)
}// 正確做法 - 重用StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {sb.append(i);
}
String result = sb.toString();

《阿里Java開發手冊》特別指出:循環體內字符串連接應使用StringBuilder的append方法。

四、代碼實現

🧑?💻 完整菜譜解析器

現在,我們把所有技術組合起來,實現一個完整的菜譜解析器:

import java.util.regex.*;
import java.util.*;public class RecipeParser {public static void main(String[] args) {String recipe = "西紅柿炒蛋 材料:西紅柿2個,雞蛋3個,鹽5克 步驟:1.西紅柿切塊 2.雞蛋打散 3.熱油下鍋";// 1. 解析菜名String dishName = parseDishName(recipe);System.out.println("菜名:" + dishName);// 2. 解析材料List<String> materials = parseMaterials(recipe);System.out.println("\n材料:");materials.forEach(System.out::println);// 3. 解析步驟List<String> steps = parseSteps(recipe);System.out.println("\n步驟:");steps.forEach(System.out::println);}// 解析菜名(第一個空格前的文本)static String parseDishName(String recipe) {return recipe.substring(0, recipe.indexOf(" "));}// 解析材料列表(使用正則表達式)static List<String> parseMaterials(String recipe) {List<String> result = new ArrayList<>();Pattern pattern = Pattern.compile("材料:(.+?) 步驟:");Matcher matcher = pattern.matcher(recipe);if (matcher.find()) {String[] items = matcher.group(1).split(",");for (String item : items) {result.add(item.trim());}}return result;}// 解析步驟(使用StringBuilder和正則)static List<String> parseSteps(String recipe) {List<String> result = new ArrayList<>();Pattern pattern = Pattern.compile("步驟:(.+)");Matcher matcher = pattern.matcher(recipe);if (matcher.find()) {String stepsStr = matcher.group(1);// 分割步驟,支持多種編號格式String[] steps = stepsStr.split("\\d+[\\.)]\\s*");for (String step : steps) {if (!step.isEmpty()) {result.add(step.trim());}}}return result;}
}

運行結果:

菜名:西紅柿炒蛋材料:
西紅柿2個
雞蛋3個
鹽5克步驟:
西紅柿切塊
雞蛋打散
熱油下鍋

🔄 代碼解析

  1. parseDishName使用簡單的substringindexOf

  2. parseMaterials使用正則提取材料部分,再用split分割

  3. parseSteps用正則處理多種編號格式,避免硬編碼

五、延展思考

🚀 菜譜搜索算法優化

當我們的菜譜App有了海量數據后,如何實現高效的搜索?讓我們看看美團技術團隊在大眾點評內容搜索中的優化實踐:

1.內容理解與標簽體系

  • 類目標簽:如"川菜"、“甜點”

  • 細粒度標簽:如"適合新手"、“少油”

  • 屬性標簽:如"含堅果"、“清真”

// 偽代碼:為菜譜打標簽
public class RecipeTagger {public Set<String> generateTags(Recipe recipe) {Set<String> tags = new HashSet<>();// 基于菜譜內容分析if (recipe.getTitle().contains("新手")) {tags.add("適合新手");}if (recipe.getMaterials().contains("辣椒")) {tags.add("辣味");}return tags;}
}

2.多模態搜索優化

現代菜譜不僅有文本,還有圖片、視頻。美團使用多模態預訓練模型,將圖文表征對齊到統一特征空間。

3.搜索滿意度優化

  • 相關性:確保"紅燒肉"不會返回素食

  • 時效性:優先顯示時令菜譜

  • 地域性:根據用戶位置推薦本地食材

冷啟動問題解決方案:對新上傳的菜譜,基于內容相似度推薦,而非用戶行為數據。

總結

🧂 字符串處理的"五味"調和

通過這次"烹飪"之旅,我們學到了:

  1. 選對工具:像選擇廚具一樣選擇字符串類

    • String:適合靜態內容,如菜譜標題

    • StringBuilder:適合頻繁拼接,如步驟組裝

    • StringBuffer:多線程環境下的選擇

  2. 掌握技巧:像掌握火候一樣掌握方法

    • 正則表達式是復雜文本解析的利器

    • 避免在循環中使用"+"拼接字符串

    • 合理使用StringJoiner等Java8新特性

  3. 性能意識:像控制調料一樣控制資源

    • 10萬次拼接測試:String(32s) vs StringBuilder(2ms)

    • 大文本處理時注意內存占用

  4. 擴展思維:像創新菜式一樣創新技術

    • 學習美團的多模態搜索優化思路

    • 考慮標簽體系提升搜索效率

字符串處理看似簡單,但要真正掌握它的"火候",需要像大廚練習刀工一樣不斷實踐。希望本文能成為你Java字符串學習路上的"菜譜",幫助你"烹飪"出更優雅高效的代碼!

下次當你處理文本時,不妨想想:我現在用的是水果刀(String)還是料理機(StringBuilder)?需要上雕刻工具(正則)嗎?記住,好代碼和好菜一樣,需要合適的工具和用心的"烹飪" 🍳💖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87187.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87187.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87187.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

webpack+vite前端構建工具 -答疑

webpack答疑 1 輸入webpack命令&#xff0c;執行的是全局版本還是本地版本的webpack 當在命令行窗口輸入webpack命令時&#xff0c;其執行優先級可通過以下步驟明確判斷&#xff1a; 1.1 【全局安裝優先機制】 執行原理&#xff1a;系統會按照環境變量PATH的順序逐級查找可執…

API接口開放平臺 Crabc 3.4 發布

Crabc 是一款 API 接口開發平臺&#xff0c;企業級接口管理、SQL2API 平臺。支持動態數據源、動態 SQL 和標簽&#xff0c; 支持接入&#xff08;mysql、oracle、達夢、TiDB、hive、es 和 mongodb&#xff09;等 SQL 或 NoSQL 數據源&#xff0c;在線可視化編寫 SQL 快速發布接…

PD快充協議芯片XSP04D支持全協議+支持串口通訊+支持與主板共用一個Type-C

隨著Type-C接口的充電器普及&#xff0c;市面上的PD充電器越來越多&#xff0c;小家電產品可不配充電器&#xff0c;使用Type-C接口&#xff0c;然后加入一顆PD協議取電協議芯片XSP08即可讓充電器/充電寶/車充等電源輸出9V/12V/15V/20V電壓給產品供電。 針對各種各樣的不同需求…

C# 高效加載txt文件內容

在 C# 中&#xff0c;高效加載 TXT 文件內容可以通過多種方法實現&#xff0c;具體方法的選擇取決于文件的大小和讀取需求。以下是一些常用的方法&#xff1a; 1. 使用 File.ReadAllText 如果文件比較小&#xff0c;并且你希望一行一行地讀取整個內容&#xff0c;可以使用 Fi…

(2)pytest執行用例的規則

1. 簡介 今天主要學習一下pytest的執行用例的規則。 2. 通過help幫助查看pytest如何使用 .查看pytest命令行參數&#xff0c;可以用pytest -h 或pytest --help查看 3. 用例設計原則 文件名以test_*.py文件和*_test.py以test_開頭的函數以Test開頭的類以test_開頭的方法所有的…

InnoDB數據頁

導讀&#xff1a; 我們已經知道了頁是數據庫存儲的基本單位&#xff0c;知道了一條行記錄的存儲格式是怎樣的&#xff0c;當數據越來越多時&#xff0c;那一條條行記錄具體又是怎么在頁中被組織起來的呢&#xff1f; 一、InnoDB數據頁結構 二、總結 1、一條條行數據是如何在數…

世賽背景下,中職物聯網應用與服務賽項實訓解決方案

一、世賽背景與物聯網應用賽項概述 1.1 世賽發展歷程及對中職教育的影響 世界技能大賽&#xff08;WorldSkills Competition&#xff0c;簡稱世賽&#xff09;自1950年創立以來&#xff0c;已經成為全球范圍內展示職業技能水平的重要賽事。截至2024年&#xff0c;世賽已成功舉…

【攻防篇】解決:阿里云docker 容器中自動啟動xmrig挖礦-- 實戰

文章目錄 場景一、問題二、原因三、解決方案1、控制臺處理2、 [清除與防護](https://blog.csdn.net/ladymorgana/article/details/148921668?spm1001.2014.3001.5501)1. 緊急處理&#xff1a;停止挖礦進程2. 清理被感染的容器3. 防護措施&#xff1a;防止再次被入侵4. 排查入侵…

飛算智造JavaAI:智能編程革命——AI重構Java開發新范式

文章目錄 引言&#xff1a;當傳統Java開發遇上AI一、技術架構解析1.1 核心架構圖1.2 關鍵技術棧 二、實戰演示&#xff1a;從需求到代碼的全AI輔助2.1 場景&#xff1a;電商優惠券系統開發2.2 代碼生成實例2.3 智能調試演示 三、與傳統開發模式對比測試3.1 基準測試數據3.2 典型…

[特殊字符] 分享裂變新姿勢:用 UniApp + Vue3 玩轉小程序頁面分享跳轉!

在如今流量成本日益攀升的移動互聯網時代&#xff0c;"用戶分享拉新" 成為了增長的重要策略。而微信小程序作為天然具備社交傳播力的平臺&#xff0c;提供了較完善的分享機制支持。本文將從實戰角度出發&#xff0c;手把手教你如何使用 uni-app Vue3 構建一個支持「…

[創業之路-458]:企業經營層 - 藍海戰略 - 重構價值曲線、整合產業要素、創造新需求

“重構價值曲線、整合產業要素、創造新需求”是藍海戰略中實現價值創新的核心路徑&#xff0c;它們構成了一個從內部優化到外部協同&#xff0c;再到市場顛覆的完整邏輯鏈條。以下從理論框架、實踐方法和企業案例三個維度展開分析&#xff1a; 一、重構價值曲線&#xff1a;打…

慢查詢引發對mysql索引的探索

目錄 一、索引分類 1.1 聚簇索引結構 1.2 非聚簇索引(二級索引) 1.3 主鍵索引 1.4 唯一索引 1.5 普通索引 1.6 前綴索引 1.7 聯合索引 1.8 索引下推 1.9 索引區分度 二、優化索引的方法 2.1 索引的特點 2.2 適合創建索引的情況 2.3 不適合創建索引的情況 2.4 優…

啟用不安全的HTTP方法

背景&#xff1a; 今天被安全檢測出一個這樣的問題&#xff1a;啟用不安全的HTTP方法。DELETE方法是用來調試web服務器連接的http方式&#xff0c;支持該方式的服務器文件可能被非法刪除&#xff1b;PUT方法用來向服務器提交文件&#xff1b;TRACE方法本用于客戶端測試到服務器…

fvcom 水深文件dep制作

fvcom 水深文件dep制作 fvcom 水深文件dep制作20250630 本次案例網格和水深展示 vv image Figure 1 Model domain 本次制作其它驅動文件的輸入文件為yellowsea.2dm 格式2dm; 文件內容格式詳細介紹參考&#xff1a; https://www.xmswiki.com/wiki/SMS:2D_Mesh_Files_*.2dm …

ViewModel是EventFlow-State映射

ViewModel負責組裝界面狀態State。引發State變換的原因有很多&#xff0c;比如用戶點擊某個按鈕&#xff0c;一次網絡請求受到應答&#xff0c;一次本地數據庫查詢返回結果等等。因此ViewModel是根據各種事件生成State的對象&#xff0c;換句話說&#xff0c;是一個從多個事件流…

javaweb Day2

PreparedStatement作用: 預編譯SQL語句并執行: 預防SQL注入問題 SQL注入:SQL注入是通過操作輸入來修改事先定義好的SQL語句&#xff0c;用以達到執行代碼對服務器進行攻擊的方法。

Java項目:基于SSM框架實現的中學教學管理系統【ssm+B/S架構+源碼+數據庫+畢業論文+開題報告】

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本景海中學教學管理系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據…

JVM調優實戰 Day 15:云原生環境下的JVM配置

【JVM調優實戰 Day 15】云原生環境下的JVM配置 文章標簽 jvm調優, 云原生, Java性能優化, JVM參數配置, 容器化部署, Kubernetes, Docker, JVM在云原生中的應用 文章簡述 隨著云原生技術的普及&#xff0c;Java 應用越來越多地運行在容器&#xff08;如 Docker&#xff09;和…

數據結構day7——文件IO

一、標準 IO 的起源與概念 標準 IO&#xff08;Standard Input/Output&#xff09;是由 Dennis Ritchie 在 1975 年設計的一套 IO 庫&#xff0c;后來成為 C 語言的標準組成部分&#xff0c;并被 ANSI C 所采納。它是對底層文件 IO 的封裝&#xff0c;提供了更便捷、可移植的文…

6.Docker部署ES+kibana

部署ES&#xff08;Elasticsearch&#xff09;kibana 1.ES暴露的端口很多 2.ES十分消耗內存 3.ES的數據一般需要掛載出去&#xff0c;放在安全目錄&#xff08;掛載) elastic 前往官方手冊 1.下載運行elasticsearch的 docker run -d --name elasticsearch --net somenet…